2017-02-02 2 views
0

AES暗号を初めて使用しています。 パスワードを暗号化するために次のJavaコードを使用していますが、正常に動作します。IVを目的のCでAES暗号化から取得するにはどうすればよいですか?

private void startEncryption() throws UnsupportedEncodingException { 
    String text = "15"; 
    String key = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    String ivString = "LXUJOLKDEJKGTMAV"; 
    byte[] valueBytes = text.getBytes(); 
    byte[] keyBytes = keyString.getBytes("UTF-8"); 
    byte[] ivBytes = ivString.getBytes(); 
    byte[] ivFinalBytes = new byte[16]; 
    for(int i=0; i<16; i++){ 
     ivFinalBytes[i] = ivBytes[i]; 
    } 
    encrypt(valueBytes, keyBytes, ivFinalBytes); 
} 

private void encrypt(byte[] valueBytes, byte[] keyBytes, byte[] ivBytes) { 
    try { 
     SecretKeySpec ks = new SecretKeySpec(keyBytes, "AES"); 
     Cipher c = Cipher.getInstance("AES/CBC/PKCS7Padding"); 
     IvParameterSpec ivParameterSpec = new IvParameterSpec(ivBytes); 
     c.init(Cipher.ENCRYPT_MODE, ks, ivParameterSpec); 
     byte[] clearText = c.doFinal(valueBytes); 
     String ivPass = Base64.encodeToString(c.getIV(), Base64.DEFAULT); 
     String pass = Base64.encodeToString(clearText, Base64.DEFAULT); 
     encryptedPassword = ivPass+pass; 
     encryptedPassword = encryptedPassword.replace("\n", "").replace("\r", ""); 
    } catch (Exception e) { 
     System.out.println("exception: "+e); 
    } 
} 

出力は次のようになります。

azhTMrwGqTN21O4oRenR6Q==VE5LTU9GT1BCWldRSEREQQ== 

を今、私は客観Cで同じことをやろうとしています私が今使っているコードを以下に示します。

-(NSString*)testActuallyEncrypting:(NSString *)data 
{ 
    NSString *key = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 
    NSString *iv = @"LXUJOLKDEJKGTMAV"; 
    NSData *dataIn = [data dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *keyData = [key dataUsingEncoding:NSUTF8StringEncoding]; 
    NSData *ivData = [iv dataUsingEncoding:NSUTF8StringEncoding]; 
    CCCryptorStatus ccStatus = kCCSuccess; 
    size_t   cryptBytes = 0; 
    NSMutableData *dataOut = [NSMutableData dataWithLength:dataIn.length + kCCBlockSizeAES128]; 
    ccStatus = CCCrypt(kCCEncrypt, 
        kCCAlgorithmAES128, 
        kCCOptionPKCS7Padding, 
        keyData.bytes, kCCKeySizeAES256, 
        ivData.bytes, 
        dataIn.bytes, dataIn.length, 
        dataOut.mutableBytes, dataOut.length, 
        &cryptBytes); 
    if (ccStatus != kCCSuccess) { 
     NSLog(@"CCCrypt status: %d", ccStatus); 
    } 
    dataOut.length = cryptBytes; 
    NSString *objcEncrypted = [dataOut base64EncodedStringWithOptions:0]; 
    NSLog(@"objcEncrypted: %@", objcEncrypted); 
    return objcEncrypted; 
} 

らしいです私は正しい暗号化されたパスワードを取得しているようです。 VE5LTU9GT1BCWldRSEREQQ ==

どうすればIVを得ることができますか?azhTMrwGqTN21O4oRenR6Q ==のようになりますか?

+0

をencryptedString返します! –

+0

ありがとうございます。私はアプリを作るだけです。暗号化はクライアントが望むものです。 – Piscean

+0

それはいいアイデアだったのですか? –

答えて

0

私はそれを考え出したとコードの次の行を追加することは私の問題を解決しました。その後、

NSString *ivEncrypted = [ivData base64EncodedStringWithOptions:0]; 
NSString *encryptedString = [NSString stringWithFormat:@"%@%@", ivEncrypted, objcEncrypted]; 

とあなたがそれらを暗号化し、パスワードではなくハッシュすべき

+0

Base64エンコーディングの前にIVと暗号化されたデータを結合する方がよいでしょう。 – zaph

関連する問題