使用CCCrypt()方法进行加密,然后在C#中对其进行解密。但是输出与原始纯文本不同。

密钥长256位,IV为默认值。

主要代码如下所示:

// Encrypt
{
    // the key is 32 bytes (256 bits).
    Byte iv[] = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };

    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,        // Operation
                                      kCCAlgorithmAES128, // Algorithm
                                      kCCOptionPKCS7Padding, // Option
                                      keyPtr,                // key
                                      kCCKeySizeAES256,      // key length
                                      iv, /* initialization vector (optional) */
                                      [self bytes],    // plain text
                                      dataLength, /* input */
                                      buffer,
                                      bufferSize, /* output */
                                      &numBytesEncrypted); //dataOutMove
    if (cryptStatus == kCCSuccess) {
        NSData *encryptedData = [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
        NSString *encryptedString = [encryptedData base64Encoding];
}

// Decrypted
{
    byte[] _key1 = { 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF, 0x12, 0x34, 0x56, 0x78, 0x90, 0xAB, 0xCD, 0xEF };
    public static string AESDecrypt(string encryptedString, string key)
    {
        AesCryptoServiceProvider aes = new AesCryptoServiceProvider();
        aes.BlockSize = 128;
        aes.KeySize = 256;
        aes.IV = _key1;
        aes.Key = Encoding.UTF8.GetBytes(key);
        aes.Mode = CipherMode.CBC;
        aes.Padding = PaddingMode.PKCS7;

        // Convert Base64 strings to byte array
        byte[] src = System.Convert.FromBase64String(encryptedString);

        // decryption
        using (ICryptoTransform decrypt = aes.CreateDecryptor())
        {
            byte[] dest = decrypt.TransformFinalBlock(src, 0, src.Length);
            return Encoding.UTF8.GetString(dest);
        }
    }
}


编辑:
我发现原因是keyPtr。在加密过程中,我像这样早期处理密钥:

char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding) [key
getCString:keyPtr maxLength:sizeof(keyPtr)
encoding:NSUTF8StringEncoding];


现在,我修改如下代码:

NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding];
NSUInteger keyLength = [keyData length];
Byte *keyPtr= (Byte *)malloc(keyLength);
memcpy(keyPtr, [keyData bytes], keyLength);


然后我得到正确的输出。
尽管问题已经解决,但我真的不知道先前版本有什么问题。

最佳答案

加密设计为即使有很小的错误也会严重失败。您需要显式检查密钥是否相同(检查字节,而不是字符)。 IVs也一样。您正在CBC模式下解码。您确定加密处于CBC模式吗?它没有在您的代码中明确设置。与填充相同。您确定加密方法正在使用PKCS7吗?

通常,不要依赖默认设置,而应在代码中显式设置它们。

最后一点,您是否在两侧使用相同的字节字符转换。同样,最好明确声明您正在使用什么。例如,UTF-8文本可能带有初始BOM表,而UTF-8转换将忽略该初始BOM表,但字节中将包含其他转换。

关于c# - AES:使用CCCrypt()方法加密并使用C#解密,输出错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18008590/

10-10 14:02
查看更多