android - iOS 和 Java 中的 AES 加密

标签 android ios encryption

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

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

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

最佳答案

问题出在 iv 参数上。

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

2) 根据 CCCrypt 的 api 文档,iv 的长度应为 16(在本例中)。请参阅下面的链接:

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

关于android - iOS 和 Java 中的 AES 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13969530/

相关文章:

ios - 修复 Xcode 9 问题 : "iPhone is busy: Preparing debugger support for iPhone"

ios - 在 UIImageView iOS 后面添加 CAGradient 层

javascript - 针对特定数据的 Crypto 与 Bcrypt

php - 如何使用 php 创建 256 位加密的 zip 文件

java - C++ 等价于 Java 加密

Android:选项卡布局的优缺点

java - 从 Android 应用程序中的 protected 目录流式传输视频

ios - 将自己分配给 UITextFieldDelegate 在 iOS 8 中有效,但在 iOS 7 中无效

android - "failed to map segment from shared object: operation not permitted"的可能原因是什么,如何调试?

android - 如何解决此 linphone $ make 错误?