AES不能解密在c#中被Objective-C加密的数据

本文关键字:Objective-C 加密 数据 中被 不能 解密 AES | 更新日期: 2023-09-27 18:08:10

我有一个iOS应用程序,它发送加密的数据,稍后在c#中解密。我已经检查了十六进制键和收到的数据是相同的,但我仍然得到坏PKCS7填充。无效长度0.

我的Objective-C调用是

  +(NSData*) encryptData: (NSData*) data
               key: (NSString*) key
{
// 'key' should be 32 bytes for AES256, will be null-padded otherwise
char keyPtr[kCCKeySizeAES256+1]; // room for terminator (unused)
bzero(keyPtr, sizeof(keyPtr)); // fill with zeroes (for padding)
// fetch key data
[key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
NSUInteger dataLength = [data length];
//See the doc: For block ciphers, the output size will always be less than or
//equal to the input size plus the size of one block.
//That's why we need to add the size of one block here
size_t bufferSize = dataLength + kCCBlockSizeAES128;
void *buffer = malloc(bufferSize);
size_t numBytesEncrypted = 0;
CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
                                      keyPtr, kCCKeySizeAES256,
                                      NULL /* initialization vector (optional) */,
                                      [data bytes], dataLength, /* input */
                                      buffer, bufferSize, /* output */
                                      &numBytesEncrypted);
if (cryptStatus == kCCSuccess) {
    //the returned NSData takes ownership of the buffer and will free it on deallocation
    return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
}
free(buffer); //free the buffer;
return nil;
}

my keysize是256,blocksize是128,padding是pkcs7, IV是null, mode是CBC(默认)

我要解密的c#代码是
            using (MemoryStream memoryStream = new MemoryStream(outputBytes))
        {
            AesManaged algo = GetCryptoAlgorithm(GetRawBrokerKey());
            using (CryptoStream cryptoStream = new CryptoStream(memoryStream, algo.CreateDecryptor(), CryptoStreamMode.Read))
            {
                using (StreamReader srDecrypt = new StreamReader(cryptoStream))
                {
                    plaintext = srDecrypt.ReadToEnd();
                }
            }
        }
    private static AesManaged GetCryptoAlgorithm()
    {
        return GetCryptoAlgorithm(null);
    }
    private static AesManaged GetCryptoAlgorithm(byte[] key)
    {
        AesManaged algorithm = new AesManaged();
        //set the mode, padding and block size
        algorithm.Padding = PaddingMode.PKCS7;
        algorithm.Mode = CipherMode.CBC;
        algorithm.KeySize = 256;
        algorithm.BlockSize = 128;
        if (key != null)
        {
            algorithm.Key = key;
        }
        algorithm.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        return algorithm;
    }

我尝试使用c#加密,看到使用相同密钥的不同十六进制输出。c# encryption - 42AC7494606333309287768F47DFB35B

    static byte[] EncryptStringToBytes_Aes(string plainText, byte[] key)
    {
        // Check arguments. 
        if (plainText == null || plainText.Length <= 0)
            throw new ArgumentNullException("plainText");
        byte[] encrypted;
        AesManaged algorithm = new AesManaged();
        //set the mode, padding and block size
        algorithm.Padding = PaddingMode.PKCS7;
        algorithm.Mode = CipherMode.CBC;
        algorithm.KeySize = 256;
        algorithm.BlockSize = 128;
        if (key != null)
        {
            algorithm.Key = key;
        }
        algorithm.IV = new byte[] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
        // Create a decrytor to perform the stream transform.
        ICryptoTransform encryptor = algorithm.CreateEncryptor();
            // Create the streams used for encryption. 
            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        //Write all data to the stream.
                        swEncrypt.Write(plainText);
                    }
                    encrypted = msEncrypt.ToArray();
                }
            }

        string hex = BitConverter.ToString(encrypted);
        Console.WriteLine("c# encryption - " + hex.Replace("-", ""));
        // Return the encrypted bytes from the memory stream. 
        return encrypted;
    }

你知道哪里出了问题吗?我似乎遵循所有的在线建议围绕默认模式和IV,我想。

AES不能解密在c#中被Objective-C加密的数据

GetCryptoAlgorithm中,需要将私钥传递给GetCryptoAlgorithm