AES加密的.net, Java (android)和iOS



使用这篇文章中的加密兼容Android和c#的例子,我已经成功地在一个。net应用程序之间实现了AES加密,该应用程序向我的Android应用程序提供XML提要。

现在,我正试图为该应用程序的iOS版本使用相同的实现。我已经找到了一些非常好的iOS AES示例,但到目前为止,似乎没有一个与我目前使用的方案相匹配。据我所知,问题在于c#和Java之间共享的16字节密钥(rawSecretKey)。在iOS的例子中,我没能找到一个类似的键来设置相同的字节数组。它有passPhrase,但没有字节数组。

如果有人知道一个很好的例子来说明这种类型的实现,这将是非常有用的。我找到的一个iOS示例是http://dotmac.rationalmind.net/2009/02/aes-interoperability-between-net-and-iphone/,但我还是不知道如何包含我文章顶部第一个链接所引用的16字节数组。

。Net和IOS都支持PKCS7Padding,但是Java不支持(除非使用一些第三方库)

。Net和Java都支持ISO10126Padding,但IOS不支持(除非使用一些第三方库)

所以我认为你需要为IOS和Java分别设置。net加密代码。

下面是一些代码示例: 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();
    }
}

for 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);
}

我只提供加密代码,因为解密代码非常相似,你可以很容易地找出它。

还有问题请留言

最新更新