在给定相同输入参数的情况下,我的vb.net加密结果与xcode加密结果不匹配

时间:2011-06-21 17:22:06

标签: vb.net xcode encryption aes

我在vb.net和xcode中设置了一个方法,用于加密字符串,只要我能告诉AES加密的相同参数。

我到处都看了,但无法找到有关他们是否使用相同加密算法和设置的信息。

这是vb.net代码:

Dim encryptAES As New AesCryptoServiceProvider()
Dim encoding As New UTF8Encoding()
Dim encryptor As ICryptoTransform

encryptAES.Key = encoding.GetBytes("12345678901234567890123456789032")
encryptAES.IV = encoding.GetBytes("1234567890123416")
encryptAES.Mode = CipherMode.CBC
encryptAES.Padding = PaddingMode.PKCS7
encryptor = encryptAES.CreateEncryptor

Dim input As Byte() = encoding.GetBytes("hello")

Dim result = encryptor.TransformFinalBlock(input, 0, input.Length)

Dim hex As String = ""
For i As Integer = 0 To result.Length - 1
    hex = hex & result(i).ToString("X2")
Next
ConsoleWrite(hex)

匹配此php加密的输出:

<?php
    $cipher = mcrypt_module_open(MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_CBC, '');
    $key256 = '12345678901234567890123456789032';
    $iv =  '1234567890123416';
    $cleartext = 'hello';
    printf("plainText: %s\n\n",$cleartext);
    if (mcrypt_generic_init($cipher, $key256, $iv) != -1)
    {
        $cipherText = mcrypt_generic($cipher,$cleartext );
        mcrypt_generic_deinit($cipher);
        printf("256-bit encrypted result:\n%s\n\n",bin2hex($cipherText));
    }
?>

这是mac代码:

IV = [@"1234567890123416" dataUsingEncoding:NSUTF8StringEncoding];
NSLog([IV base64EncodingWithLineLength:0]);

NSData * localKey = [@"12345678901234567890123456789032" dataUsingEncoding:NSUTF8StringEncoding];
NSLog([localKey base64EncodingWithLineLength:0]);

NSLog(@"encode plaintext:");
NSLog([self.data base64EncodingWithLineLength:0]);

CCCryptorStatus result = CCCrypt( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding, 
                                     localKey, kCCKeySizeAES256,
                                     IV, //initialization vector 
                                     [self.data mutableBytes], [self.data length], //input
                                     buffer, bufferSize, //output
                                     &numBytesEncrypted );

self.data = [self.data initWithBytes:buffer length:numBytesEncrypted];
NSLog(@"encode end result:");
NSLog([self.data base64EncodingWithLineLength:0]);

所以我可以告诉mac代码必须是错误的,因为它返回一个不同的值(相同的长度)。

以下是pac和mac版本的调试转储。

pc(base64中的值):

key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMzI=
iv: MTIzNDU2Nzg5MDEyMzQxNg==
plaintext: aGVsbG8=
encrypted: oiUIdi9StezV93+nXctCKw==

mac(base 64中的值):

key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMzI=
iv: MTIzNDU2Nzg5MDEyMzQxNg==
plaintext: aGVsbG8=
encrypted: rU5MgfNIjx7zqD5Cdh2mlA==

我还看了一下endianness这里是pc加密的base64,它既有endianness又不匹配mac版本:

oiUIdi9StezV93+nXctCKw==
K0LLXad/99XstVIvdgglog==

我现在运行一个测试,我将密钥设置为32 0,IV设置为16 0(所以字节顺序应该无关紧要)并且还有两个测试结果来自mac:

BfG2gjzkooiJCXgIQJKyZg== (iOS 5 on device)
n9KJXqThiuKyrNPjo7V7PA== (iOS 5 in simulator)
cCH116bIlLeUOxNDwFt2rg== (iOS 4.3 in simulator)

WTH?所有参数都是相同的,只有更改是要编译的版本,每个加密都不同......

和电脑结果:

wjXeJNI54DzI43fGBPymew==

当将mac加密文本输入到PC中进行解密时,我收到“填充无效且无法删除”。错误。

任何人都可以提供的任何信息都将非常感激。

1 个答案:

答案 0 :(得分:2)

mac和pc版本都涉及首先从示例文本创建一个字节数组,然后将这个字节数组传递给加密算法。我将首先比较这些字节数组,以确保您正在加密相同的数据。看起来在这两种情况下你都有utf8和AES128,但它确实没有伤害。

接下来,加密算法的结果也是一个字节数组,然后必须将其重新编码为字符串。查看结果,我看到的不仅仅是两个不同的值,而是两个完全不同的字符。这告诉我重新编码可能会关闭。同样,您想要比较字节数组。

在这两种情况下,为了确保准确的比较,我会对数组进行base64编码。