AES无法解密在Objective-C中加密的C#中的数据

时间:2015-08-17 08:24:46

标签: c# objective-c encryption interop aes

我有一个iOS应用程序,它发送加密数据,稍后在C#中解密。我已经检查过十六进制密钥和收到的数据是一样的,但我仍然得到Bad 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;

}

我的密钥大小为256,blocksize为128,填充为pkcs7,IV为空,模式为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的默认值的所有在线建议。

1 个答案:

答案 0 :(得分:1)

<{1>}中的

,您需要将私钥传递给GetCryptoAlgorithm