Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- intermediateCodeHex, isValid = base58decode(intermediateCode,1,0)
- if (isValid == False) or (len(intermediateCodeHex) != 98):
- raiseError("bip0038encrypt intermediate code base58 checksum mis-match or length error","655")
- lotsequencebyte = intermediateCodeHex[:-82][14:]
- if lotsequencebyte == "53":
- useLotAndSequence = False
- elif lotsequencebyte == "51":
- useLotAndSequence = True
- else:
- raiseError("bip0038encrypt intermediate code error","656")
- magicBytes = intermediateCodeHex[:-82]
- ownerentropy = intermediateCodeHex[:-66][16:]
- passpoint = intermediateCodeHex[32:]
- if useLotAndSequence == True:
- lotsequence = ownerentropy[8:]
- ownersalt = ownerentropy[:-8]
- flagByte = flagByte + int("04",16)
- else:
- ownersalt = ownerentropy
- flagByte = hexX(flagByte)
- if len(flagByte) != 2:
- raiseError("FlagByte length error","656b")
- seedb = hexX(random256bit())[:-16]
- if len(seedb) > 48:
- for i in range(len(seedb) - 48):
- seedb = seedb[:-1]
- elif len(seedb) < 48:
- for i in range(48 - len(seedb)):
- seedb = "0" + seedb
- factorb = sha256hexstring(sha256hexstring(seedb))
- factorbint = intfromhexstring(factorb)
- passpointUncompressed = uncompresspubkey(passpoint)
- passpointX, passpointY = intfromhexstring(passpointUncompressed[2:][:-64]), intfromhexstring(passpointUncompressed[66:])
- generatedaddressKeyX, generatedaddressKeyY = EccMultiply(passpointX,passpointY,factorbint)
- generatedaddressKeyUncompressed = str("04") + hexX(generatedaddressKeyX) + hexX(generatedaddressKeyY)
- if isPubCompressed == True:
- generatedaddress = pubKeytoBitcoinAddress(compresspubkey(generatedaddressKeyUncompressed))
- else:
- generatedaddress = pubKeytoBitcoinAddress(generatedaddressKeyUncompressed)
- addresshash = sha256hexstring(sha256strtext(generatedaddress))[:-56]
- passphrase = binascii.unhexlify(passpoint)
- scryptSalt = addresshash + ownerentropy
- scryptSalt = binascii.unhexlify(scryptSalt)
- scryptHash = hexX(scrypt.hash(passphrase,scryptSalt,1024,1,1,64))
- derivedHalf1 = scryptHash[:-64]
- derivedHalf2 = scryptHash[64:]
- derivedHalf1FirstHalf = derivedHalf1[:-32]
- derivedHalf1SecondHalf = derivedHalf1[32:]
- seedbFirstTwoThirds = seedb[:-16]
- seedbLastThird = seedb[32:]
- encryption1KeyHexStr = derivedHalf2
- messageToEncrypt1InHexStr = xorhexstrs(seedbFirstTwoThirds,derivedHalf1FirstHalf)
- encryptedHalf1 = aes_Encrypt(messageToEncrypt1InHexStr,encryption1KeyHexStr)
- encryptedHalf1FirstHalf = encryptedHalf1[:-16]
- encryptedHalf1SecondHalf = encryptedHalf1[16:]
- encryptedHalf1SecondHalfCATseedbLastThird = encryptedHalf1SecondHalf + seedbLastThird
- messageToEncrypt2InHexStr = xorhexstrs(encryptedHalf1SecondHalfCATseedbLastThird,derivedHalf1SecondHalf)
- encryption2KeyHexStr = derivedHalf2
- encryptedHalf2 = aes_Encrypt(messageToEncrypt2InHexStr,encryption2KeyHexStr)
- finalHexString = prefix1 + flagByte + addresshash + ownerentropy + encryptedHalf1FirstHalf + encryptedHalf2
- # End address creation, now we are deriving the confirmation code
- pointb = privtopub(factorb)
- pointbPreXORprefox = pointb[:-64]
- derivedHalf2LastByte = derivedHalf2[62:]
- prexorprefix = bitwiseandhexstrs(derivedHalf2LastByte,"01")
- pointbprefix = xorhexstrs(prexorprefix,pointbPreXORprefox)
- pointbFirstHalf = pointb[2:][:-32]
- pointbSecondHalf = pointb[34:]
- confirmEncryption1KeyHexStr = derivedHalf2
- confirmMessageToEncrypt1InHexStr = xorhexstrs(pointbFirstHalf,derivedHalf1FirstHalf)
- pointbx1 = aes_Encrypt(confirmMessageToEncrypt1InHexStr,confirmEncryption1KeyHexStr)
- confirmEncryption2KeyHexStr = derivedHalf2
- confirmMessageToEncrypt2InHexStr = xorhexstrs(pointbSecondHalf,derivedHalf1SecondHalf)
- pointbx2 = aes_Encrypt(confirmMessageToEncrypt2InHexStr,confirmEncryption2KeyHexStr)
- encryptedpointb = pointbprefix + pointbx1 + pointbx2
- confirmFinalHexString = str("643bf6a89a") + flagByte + addresshash + ownerentropy + encryptedpointb
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement