4

私はこの種の暗号化の完全な初心者ですが、Java アプリと iOS を持っており、両方でテキストを暗号化して同じ結果を得られるようにしたいと考えています。AESを使用しています。もちろん、少し変更してこれらのコードを見つけましたが、異なる結果を返します

iOS コード:

- (NSData *)AESEncryptionWithKey:(NSString *)key {    
    unsigned char keyPtr[kCCKeySizeAES128] = { 'T', 'h', 'e', 'B', 'e', 's', 't', 'S', 'e', 'c', 'r','e', 't', 'K', 'e', 'y' };
    size_t bufferSize = 16;
    void *buffer = malloc(bufferSize);
    size_t numBytesEncrypted = 0;
    const char iv2[16] = {  65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 };
    CCCryptorStatus cryptStatus = CCCrypt(kCCEncrypt,
                                          kCCAlgorithmAES128,
                                          kCCOptionECBMode | kCCOptionPKCS7Padding,,
                                          keyPtr,
                                          kCCKeySizeAES128,
                                          iv2,
                                          @"kayvan",
                                          6,
                                          dataInLength,
                                          buffer,
                                          bufferSize,
                                          &numBytesEncrypted);


    if (cryptStatus == kCCSuccess) {
        return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted];
    }

    free(buffer);
    return nil;
}

Javaコードは次のとおりです。

public static void main(String[] args) throws Exception {
    String password = "kayvan";
    String key = "TheBestSecretKey";
    String newPasswordEnc = AESencrp.newEncrypt(password, key);
    System.out.println("Encrypted Text : " + newPasswordEnc);
}

そして別のJavaクラス(AESencrp.class)で私は持っています:

public static final byte[] IV = { 65, 1, 2, 23, 4, 5, 6, 7, 32, 21, 10, 11, 12, 13, 84, 45 };
public static String newEncrypt(String text, String key) throws Exception {
    Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
    byte[] keyBytes= new byte[16];
    byte[] b= key.getBytes("UTF-8");
    int len = 16; 
    System.arraycopy(b, 0, keyBytes, 0, len);
    SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
    IvParameterSpec ivSpec = new IvParameterSpec(IV);
    System.out.println(ivSpec);
    cipher.init(Cipher.ENCRYPT_MODE,keySpec,ivSpec);
    byte[] results = cipher.doFinal(text.getBytes("UTF-8"));
    String result = DatatypeConverter.printBase64Binary(results);
    return result;
}

暗号化したかった文字列はkayvan、キーを使用していますTheBestSecretKey。Base64 エンコード後の結果は次のとおりです。

iOS の場合:9wXUiV+ChoLHmF6KraVtDQ==

Java の場合:/s5YyKb3tDlUXt7pqA5OFA==

私は今どうすればいい?

4

5 に答える 5

7

iOS/Android/Node.js AES256 同じ結果エンコーディングで要点を作成しましたhttps://gist.github.com/m1entus/f70d4d1465b90d9ee024

于 2014-05-27T09:10:10.193 に答える
1

AES 暗号化を実装する際に注意すべきいくつかの重要事項:
1. プレーン テキストを暗号化キーとして使用しないでください。常にプレーン テキスト キーをハッシュしてから、暗号化に使用します。
2. 暗号化と復号化には常にランダム IV (初期化ベクトル) を使用します。真のランダム化は重要です。上記の例では、初期化ベクトルは設定されていません。これはセキュリティ上の欠陥です。
私は最近、Github に投稿した C#、iOS、および Android 用のクロスプラットフォーム AES 暗号化および復号化ライブラリを作成しました。ここで確認できます - https://github.com/Pakhee/Cross-platform-AES-encryption

于 2014-07-03T18:43:32.787 に答える