Aes
這是使用對稱加密的正確方法嗎?
如果我想在 AES 中加密一些文本塊,但在解密時我沒有辦法檢查對稱密鑰是否正確。所以我:
- 生成一個隨機密鑰,並使用它來加密文本。
- 使用使用者提供的密鑰加密隨機密鑰及其雜湊。
- 將所有內容保存到文件中。
加密
var userKey; var plainText; var randomKey256 = generateHexString(256); var hash256 = sha(randomKey256); var signature512 = concat(randomKey256, hash256); var header = AES256_encrypt(signature512, userKey); var cipher = AES256_encrypt(plainText, randomKey256); var encryptedFile = concat(header, cipher);
解密
var userKey; var encryptedFile; //split encryptedFile in header|dataCipher var header = encryptedData.substring(0,512); var dataCipher = encryptedData.substring(512, null); var signature512 = AES256_decrypt(header, userKey); //split signature512 in RandomKey|Hash var randomKey256 = signature512.substring(0,256); var hash256 = signature512.substring(256,256); if(SHA(randomKey256)==hash256){ //valid key var plainText = AES256_decrypt(dataCipher, randomKey256); } else{ //invalid user key }
顯然這不是真正的程式碼。我明白我不會實施自己的安全措施。我假設整個事情將在安全的環境中加密。使用者密鑰不會在任何地方傳輸或儲存。
您所做的似乎可以驗證密鑰是否正確。
但是,除非 AES256_encrypt 使用經過身份驗證的加密模式(在這種情況下,整個練習都是不必要的),否則沒有什麼可以阻止攻擊者修改消息。並且根據所使用的加密模式,這甚至會損害消息的隱私。
最好使用身份驗證。例如,您可以計算數據的 HMAC。如果消息經過身份驗證,這將立即證明 HMAC 密鑰是正確的。為了證明 AES 密鑰也是正確的,您可以從相同的基本密鑰中導出它們,例如
a = HMAC(k, 'auth'), e = HMAC(k, 'enc')
,然後將密鑰a
用於密文上的 HMAC 和e
AES 加密。
對於對稱密鑰加密,一般來說,您必須將密鑰提供給另一端進行解密。如果您使用具有相同參數的相同函式,則可以在接收端生成相同的隨機密鑰。
我也有點困惑,因為你在你的程序中也使用了“簽名”這個詞。你說的是加密還是簽名?請注意,簽名的生成不同於加密。