2

私はこの暗号化の初心者です。サーバー側でファイルを暗号化し(AES Encryprtionを使用)、iOSとAndroidアプリの両方でクライアント側で復号化する必要があるAndroidとiOSの両方のアプリケーションを作成しています。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;
}

この問題の解決策または提案を教えてください

4

1 に答える 1

5

問題はivパラメータにあります。

NSString*1) aを として渡していivます。おそらく実際のバイトを渡したいでしょう。

iv2) CCCrypt の API ドキュメントによると、(この場合)の長さは 16 である必要があります。以下のリンクを参照してください。

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

于 2012-12-21T06:42:44.490 に答える