【问题标题】:AES Encryption in iOS and JavaiOS 和 Java 中的 AES 加密
【发布时间】:2012-12-20 09:59:58
【问题描述】:

我是这种加密的新手。我正在为 android 和 iOS 创建一个应用程序,其中我必须在服务器端加密(使用 AES Encryprtion)文件并在 iOS 和 Android 应用程序的客户端解密。我在互联网上获得了代码来为 Android 和 iOS 执行 AES 加密和解密,它们工作正常。他们使用java的服务器端。但问题是iOS程序无法解密Java加密文件,即使我得到相同的文件大小,但文件格式不正确。我在下面发布了代码...

Java加解密:

public static byte[] encrypt(byte[] data, byte[] key, byte[] ivs) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
            byte[] finalIvs = new byte[16];
            int len = ivs.length > 16 ? 16 : ivs.length;
            System.arraycopy(ivs, 0, finalIvs, 0, len);
            IvParameterSpec ivps = new IvParameterSpec(finalIvs);
            cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivps);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

    public static byte[] decrypt(byte[] data, byte[] key, byte[] ivs) {
        try {
            Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
            SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
            byte[] finalIvs = new byte[16];
            int len = ivs.length > 16 ? 16 : ivs.length;
            System.arraycopy(ivs, 0, finalIvs, 0, len);
            IvParameterSpec ivps = new IvParameterSpec(finalIvs);
            cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivps);
            return cipher.doFinal(data);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

iOS 解密代码:

- (NSData *) decryptFile:(NSString *)key withData:(NSData *)fileData {

    char keyPtr[kCCKeySizeAES128+1]; 
    bzero(keyPtr, sizeof(keyPtr)); 

    NSString* iv = @"12345678";

    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];

    NSUInteger dataLength = [fileData length];

    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);

    size_t numBytesDecrypted = 0;

    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,keyPtr, kCCKeySizeAES128,
                                          iv /* initialization vector (optional) */,
                                          [fileData bytes], dataLength, /* input */
                                          buffer, bufferSize, /* output */
                                          &numBytesDecrypted);

    if (cryptStatus == kCCSuccess) {
        //the returned NSData takes ownership of the buffer and will free it on deallocation
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }

    free(buffer); //free the buffer;
    return nil;
}

给我任何解决这个问题的方法或建议

【问题讨论】:

  • 复制和粘贴编程不成功?难以置信...
  • 好的 GregS,我相信复制和粘贴不起作用。开始学习这个加密和解密。谢谢你的回复.....
  • 在这里查看我和 Xandrus 的答案stackoverflow.com/questions/17535918/…
  • 你有密码吗?
  • 如何在 PHP 中解密使用上述算法加密的字符串。

标签: android ios encryption


【解决方案1】:

问题在于iv 参数。

1) 您将NSString* 作为iv 传递。您可能想传入实际字节。

2) 根据 CCCrypt 的 api 文档,iv 的长度应该是 16(在这种情况下)。见以下链接:

http://www.opensource.apple.com/source/CommonCrypto/CommonCrypto-36064/CommonCrypto/CommonCryptor.h

【讨论】:

  • 我们通过消除 iv 术语解决了这个问题,并对填充模式进行了一些小的更改。无论如何谢谢你的回复........
  • @Mahes 你能准确地说出你做了什么吗?尤其是“填充模式的微小变化”?
  • @Mahes,你能在答案部分分享你的加密(ios)和解密(java)代码吗?希望对很多人有所帮助...
猜你喜欢
  • 2011-11-22
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多