JavaとObjective-C間で正しくAES暗号をやり取りする方法

Objective-CでAES暗号化をする方法を調べると、以下のように書かれている事が多いが、これだとJavaと互換性がない。

;

最初、Java(サーバー)側で暗号がデコードできなくて、色々調べてみたらAES暗号のBlock cipher modeが違うという事が分かった。

解決方法はJava側でObjective-C標準のCipher Block Chaining (CBC)モードに合わせてやるか、Objective-C側の実装を切り替えてやる必要がある。

このブログにObjective-C側の実装を切り替える方法が記載されていたので、参考にして欲しい。

以下のコードを保存して、プログラム中からimportすると上の書き方でJavaで復号できるAES暗号処理が行える。

//NSDataEx.h
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCryptor.h>

@interface NSDataEx : NSData {
    
}

@end
//NSDataEx.m
#import "NSDataEx.h"

@implementation NSData (Additions)

@class NSString; 

- (NSData *)AES256EncryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [self length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesEncrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt, kCCAlgorithmAES128,       
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeAES128,
                                          NULL,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesEncrypted);
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }
    free(buffer);
    return nil;
}

- (NSData *)AES256DecryptWithKey:(NSString *)key {
    char keyPtr[kCCKeySizeAES256+1];
    bzero(keyPtr, sizeof(keyPtr));
    
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding];
    
    NSUInteger dataLength = [self length];
    
    size_t bufferSize = dataLength + kCCBlockSizeAES128;
    void *buffer = malloc(bufferSize);
    
    size_t numBytesDecrypted = 0;
    CCCryptorStatus cryptStatus = CCCrypt(kCCDecrypt, kCCAlgorithmAES128, 
                                          kCCOptionPKCS7Padding | kCCOptionECBMode,
                                          keyPtr, kCCBlockSizeAES128,
                                          NULL,
                                          [self bytes], dataLength,
                                          buffer, bufferSize,
                                          &numBytesDecrypted);
    
    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesDecrypted];
    }
    free(buffer);
    return nil;
}
@end
Be Sociable, Share!

「JavaとObjective-C間で正しくAES暗号をやり取りする方法」への2件のフィードバック

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください