3
4

1 回答 1

3

使用密码原语很容易犯实现错误,人们总是这样做,如果可以的话,最好使用高级库

我有一个片段,我试图保持审查和更新,它非常接近你正在做的事情。它还对密文进行身份验证,如果有对手可以将选择的密文发送到您的解密实现,我会建议这样做,有很多与修改密文相关的旁道攻击。

但是,您遇到的问题与填充没有任何关系,如果您的密文与您的密钥和 iv 不匹配,并且您没有验证您的 iv 和密文,您通常会收到填充错误(如果这是冒泡客户端,则称为填充 oracle)。您需要将主要语句更改为:

    string valid128BitString = "AAECAwQFBgcICQoLDA0ODw==";
    string inputValue = "Test";
    string keyValue = valid128BitString;


    byte[] byteValForString = Encoding.UTF8.GetBytes(inputValue);
    EncryptResult result = Aes128Utility.EncryptData(byteValForString, keyValue);
    EncryptResult encyptedValue = new EncryptResult();
    encyptedValue.IV = result.IV; //<--Very Important
    encyptedValue.EncryptedMsg = result.EncryptedMsg;

    string finalResult =Encoding.UTF8.GetString(Aes128Utility.DecryptData(encyptedValue, keyValue));

因此,您使用与加密相同的 IV 进行解密。

于 2013-02-18T16:19:29.150 回答