我对加密知之甚少,但我的目标是基本上解密字符串。我得到了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中的最佳答案解密字符串
答案 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;
}