Я настроил метод в 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.
шт (значения в base64):
key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMzI=
iv: MTIzNDU2Nzg5MDEyMzQxNg==
plaintext: aGVsbG8=
encrypted: oiUIdi9StezV93+nXctCKw==
mac (значения в базе 64):
key: MTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMzI=
iv: MTIzNDU2Nzg5MDEyMzQxNg==
plaintext: aGVsbG8=
encrypted: rU5MgfNIjx7zqD5Cdh2mlA==
Я также посмотрел на порядок байтов здесь - это шифрованный base64 для ПК с обоими порядками байтов и ни один из них не совпадает с версией для 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-текста в компьютер для расшифровки я получаю «Заполнение недействительно и не может быть удалено». ошибка.
Любая информация, которую кто-либо может предоставить, будет принята с благодарностью.