我在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中进行解密时,我收到“填充无效且无法删除”。错误。
任何人都可以提供的任何信息都将非常感激。
答案 0 :(得分:2)
mac和pc版本都涉及首先从示例文本创建一个字节数组,然后将这个字节数组传递给加密算法。我将首先比较这些字节数组,以确保您正在加密相同的数据。看起来在这两种情况下你都有utf8和AES128,但它确实没有伤害。
接下来,加密算法的结果也是一个字节数组,然后必须将其重新编码为字符串。查看结果,我看到的不仅仅是两个不同的值,而是两个完全不同的种字符。这告诉我重新编码可能会关闭。同样,您想要比较字节数组。
在这两种情况下,为了确保准确的比较,我会对数组进行base64编码。