Шифрование AES для .NET, Java (Android) и iOS - PullRequest
6 голосов
/ 21 сентября 2011

Используя пример из этого поста Шифрование, совместимое между Android и C # , я успешно реализовал шифрование AES между приложением .NET, которое предоставляет потоки XML для моего приложения Android.

Теперь,Я пытаюсь использовать эту же реализацию для iOS-версии этого приложения.Я нашел несколько действительно хороших примеров AES для iOS, но пока что ни один из них не соответствует схеме, которую я сейчас использую.Из того, что я могу сказать, проблема заключается в 16-байтовом ключе, который совместно используется C # и Java (rawSecretKey).В примерах iOS я не смог найти аналогичный ключ для установки с тем же байтовым массивом.Он имеет passPhrase, но не байтовый массив.

Если кто-нибудь знает хороший пример, иллюстрирующий этот тип реализации, это было бы очень полезно.Один пример для iOS, который я нашел, был http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/,, но, опять же, я не вижу, как включить 16-байтовый массив, на который ссылается первая ссылка в верхней части моего сообщения.

1 Ответ

8 голосов
/ 13 февраля 2012

.Net и IOS поддерживают PKCS7Padding, но Java не поддерживает (если не использует стороннюю библиотеку)

.Net и Java поддерживают ISO10126Padding, но IOS не поддерживает (если не использует какую-либо библиотеку третьего патри)

Так что я думаю, что вам нужен отдельный код шифрования .net для IOS и Java.

Вот несколько примеров кода:

для IOS:

+ (NSData*)encryptData:(NSData*)data :(NSData*)key :(NSData*)iv
{    
    size_t bufferSize = [data length]*2;
    void *buffer = malloc(bufferSize);
    size_t encryptedSize = 0;    
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,                                          
                                          [key bytes], [key length], [iv bytes], [data bytes], [data length],                                          
                                          buffer, bufferSize, &encryptedSize);  
    if (cryptStatus == kCCSuccess)      
        return [NSData dataWithBytesNoCopy:buffer length:encryptedSize];    
    else
        free(buffer);
    return NULL;
}

для .NET:

public static byte[] AesEncrypt(byte[] bytes, byte[] key, byte[] iv)
{
    if (bytes == null || bytes.Length == 0 || key == null || key.Length == 0 || iv == null || iv.Length == 0)
        throw new ArgumentNullException();

    using (var memoryStream = new MemoryStream())
    {
        using (var rijndaelManaged = new RijndaelManaged { Key = key, IV = iv, Padding = PaddingMode.PKCS7, Mode = CipherMode.CBC })
        {
            using (var cryptoStream = new CryptoStream(memoryStream, rijndaelManaged.CreateEncryptor(key, iv), CryptoStreamMode.Write))
            {
                cryptoStream.Write(bytes, 0, bytes.Length);
            }
        }
        return memoryStream.ToArray();
    }
}

для Java:

public static byte[] encrypt(byte[] bytes, byte[] key, byte[] iv)
        throws Exception
{
    Cipher cipher = Cipher.getInstance("AES/CBC/ISO10126Padding");
    cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(key, "AES"),
            new IvParameterSpec(iv));
    return cipher.doFinal(bytes);
}

Я предоставляю код для шифрования только потому, что код дешифрования очень похож, и вы можете легко его выяснить.

Если у вас есть еще вопросы, пожалуйста, оставляйте комментарии.

...