Aes

這是使用對稱加密的正確方法嗎?

  • December 20, 2015

如果我想在 AES 中加密一些文本塊,但在解密時我沒有辦法檢查對稱密鑰是否正確。所以我:

  1. 生成一個隨機密鑰,並使用它來加密文本。
  2. 使用使用者提供的密鑰加密隨機密鑰及其雜湊。
  3. 將所有內容保存到文件中。

加密

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 和eAES 加密。

對於對稱密鑰加密,一般來說,您必須將密鑰提供給另一端進行解密。如果您使用具有相同參數的相同函式,則可以在接收端生成相同的隨機密鑰。

我也有點困惑,因為你在你的程序中也使用了“簽名”這個詞。你說的是加密還是簽名?請注意,簽名的生成不同於加密。

引用自:https://crypto.stackexchange.com/questions/30370