python代码加密解密_在python中加密 – 在Javascript中解密
您的Python代碼和CryptoJS代碼存在許多問題:
>您使用隨機IV加密Python中的一些明文.如果要檢索該明文,則需要在解密期間使用相同的IV.沒有IV,明文就無法恢復.通常,IV只是前置于密文,因為它不必是秘密的.因此,您需要在解密期間讀取IV,而不是生成新的IV.
>您在CryptoJS中使用CBC模式(默認)而不是CFB模式.模式必須相同.另一個棘手的部分是CFB模式使用段大小進行參數化. PyCrypto默認使用8位段(CFB8),但CryptoJS僅針對128位(CFB128)的固定段實現.由于PyCrypto版本是可變的,您需要更改它.
> CryptoJS decrypt()函數將密文作為OpenSSL格式的字符串或CipherParams對象.由于您沒有OpenSSL格式的字符串,因此必須將密文轉換為對象.
> CryptoJS的密鑰應該是WordArray而不是字符串.
>使用相同的填充.如果使用CFB8,PyCrypto不會填充明文,但在使用CFB128時需要填充. CryptoJS默認使用PKCS#7填充,因此您只需要在python中實現該填充.
Python代碼(適用于版本2):
def pad(data):
length = 16 - (len(data) % 16)
return data + chr(length)*length
def unpad(data):
return data[:-ord(data[-1])]
def encrypt(message, passphrase):
IV = Random.new().read(BLOCK_SIZE)
aes = AES.new(passphrase, AES.MODE_CFB, IV, segment_size=128)
return base64.b64encode(IV + aes.encrypt(pad(message)))
def decrypt(encrypted, passphrase):
encrypted = base64.b64decode(encrypted)
IV = encrypted[:BLOCK_SIZE]
aes = AES.new(passphrase, AES.MODE_CFB, IV, segment_size=128)
return unpad(aes.decrypt(encrypted[BLOCK_SIZE:]))
JavaScript代碼:
var base64ciphertextFromPython = "...";
var ciphertext = CryptoJS.enc.Base64.parse(base64ciphertextFromPython);
// split iv and ciphertext
var iv = ciphertext.clone();
iv.sigBytes = 16;
iv.clamp();
ciphertext.words.splice(0, 4); // delete 4 words = 16 bytes
ciphertext.sigBytes -= 16;
var key = CryptoJS.enc.Utf8.parse("1234567890123456");
// decryption
var decrypted = CryptoJS.AES.decrypt({ciphertext: ciphertext}, key, {
iv: iv,
mode: CryptoJS.mode.CFB
});
console.log ( decrypted.toString(CryptoJS.enc.Utf8));
其他考慮:
您似乎想要使用密碼作為密鑰.密碼短語通常是人類可讀的,但密鑰則不是.您可以使用包含PBKDF2,bcrypt或scrypt等功能的密碼來派生密鑰.
上面的代碼并不完全安全,因為它缺乏身份驗證.未經驗證的密文可能會導致可行的攻擊和未被注意的數據操作.通常,加密然后MAC方案與良好的MAC功能一起使用,例如HMAC-SHA256.
總結
以上是生活随笔為你收集整理的python代码加密解密_在python中加密 – 在Javascript中解密的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python爬虫实例手机_Python爬
- 下一篇: python种颜色循环_Python 实