0

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

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

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

使用指定的算法和私钥加密 blob clearText 。当您希望 Salesforce 为您生成初始化向量时,请使用此方法。它存储为加密 blob 的前 128 位(16 个字节)

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;
        }

(只需忽略输入是硬编码且未参数化的事实;更易于测试)

然后使用此问题的最佳答案来解密字符串

4

1 回答 1

3

IV 不应该表示为字符串 - 它应该是字节数组,根据AesManaged.IVproperty

此外,使用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;
}
于 2012-05-24T18:56:29.243 回答