мой результат шифрования vb.net не совпадает с результатом шифрования xcode при тех же входных параметрах - PullRequest
0 голосов
/ 21 июня 2011

Я настроил метод в 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-текста в компьютер для расшифровки я получаю «Заполнение недействительно и не может быть удалено». ошибка.

Любая информация, которую кто-либо может предоставить, будет принята с благодарностью.

1 Ответ

2 голосов
/ 23 июня 2011

В обеих версиях - mac и pc - сначала создается байтовый массив из образца текста, и именно этот байтовый массив затем передается алгоритму шифрования.Я бы начал со сравнения этих байтовых массивов, чтобы убедиться, что вы шифруете одни и те же данные.Похоже, что в обоих случаях у вас есть utf8 и AES128, но это никогда не повредит.

Далее, результатом алгоритма шифрования является также байтовый массив, который затем необходимо перекодировать в виде строки,Глядя на ваши результаты, я вижу не просто два разных значения, а два совершенно разных вида символов.Это говорит мне, что перекодирование может быть отключено.Опять же, вы хотите сравнить байтовые массивы.

В обоих случаях для обеспечения точного сравнения я бы base64 кодировал массивы.

...