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

C# 如何从加密字符串中检索IV,然后使用AES128解密该字符串,c#,encryption,C#,Encryption,我对加密知之甚少,但我的目标是从本质上解密字符串。我已获得AES(128)密钥 但是,我必须从加密字符串中检索IV,这是前16位 这是salesforce的文档以获取更多信息(如果我解释的不正确) 使用指定的算法和专用密钥加密blob明文 钥匙当您希望Salesforce生成 初始化向量。它存储为前128位(16 加密blob的字节数 (encryptWithManagedIV) 为了找回静脉注射,我尝试过类似的方法(但我不相信这是正确的): publicstringretrieveiv() {

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

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

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

使用指定的算法和专用密钥加密blob明文 钥匙当您希望Salesforce生成 初始化向量。它存储为前128位(16 加密blob的字节数

(encryptWithManagedIV)

为了找回静脉注射,我尝试过类似的方法(但我不相信这是正确的):

publicstringretrieveiv()
{
字符串iv=“”;
字符串输入=“bwZ6nKpBEsuAKM8lDTYH1Yl69KkHN1i3XehALbfgUqY=”;
byte[]bytesToEncode=Encoding.UTF8.GetBytes(输入);

对于(inti=0;i而言,IV不应表示为字符串-根据

另外,使用
编码.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;
}

@理查德:你搞错了:base64中需要4个字符才能存储3个字节。通常,加密数据使用base64转换为文本。字符肯定不等于字节。@JonSkeet..不应该是吗?byte[]iv=新字节[15]…它需要是16字节数组,所以如果你放入16,它将是从0开始的17字节数组,不是吗?@LaurenceNyein:不,C#中的数组不是这样工作的。如果你要一个16字节数组,你就会得到一个16字节数组。
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;
}