如何从加密字符串中检索IV,然后使用AES128解密该字符串

时间:2012-05-24 18:51:21

标签: c# encryption

我对加密知之甚少,但我的目标是基本上解密字符串。我得到了AES(128)密钥。

但是,我必须从加密字符串中检索IV,这是前16位。

以下是salesforce的文档以获取更多信息(如果我解释的不正确)

  

使用指定的算法和private加密blob clearText   键。如果希望Salesforce生成,请使用此方法   初始化向量。它存储为前128位(16   加密blob的字节数

http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_restful_crypto.htm(encryptWithManagedIV)

对于检索IV我尝试过这样的事情(我不相信它是正确的):

public string retrieveIv()
        {
            string iv = "";
            string input = "bwZ6nKpBEsuAKM8lDTYH1Yl69KkHN1i3XehALbfgUqY=";
            byte[] bytesToEncode = Encoding.UTF8.GetBytes(input);

            for(int i = 0; i <= 15; i++){
                iv += bytesToEncode[i].ToString(); ;
            }

            return iv;
        }

(只是忽略输入是硬编码而不是参数化的事实;更容易用于测试目的)

然后使用此question中的最佳答案解密字符串

1 个答案:

答案 0 :(得分:2)

IV不应该表示为字符串 - 它应该是一个字节数组,按照AesManaged.IV property

此外,使用Encoding.UTF8几乎肯定是错误的。我怀疑你想要:

public static byte[] RetrieveIv(string encryptedBase64)
{
    // We don't need to base64-decode everything... just 16 bytes-worth
    encryptedBase64 = encryptedBase64.Substring(0, 24);

    // This will be 18 bytes long (4 characters per 3 bytes)
    byte[] encryptedBinary = Convert.FromBase64String(encryptedBase64);
    byte[] iv = new byte[16];

    Array.Copy(encryptedBinary, 0, iv, 0, 16);
    return iv;
}