2016-11-24 2 views
0

私はAndroidアプリケーションでAES/CBC/PKCS5Paddingを使用しています。私は両方のコードでMD5 digestを使用しない場合、コードはlike-AES/CBC/PKCS5 iOSとAndroidのパッドとMD5

private static String TRANSFORMATION = "AES/CBC/PKCS5Padding"; 

private static String ALGORITHM = "AES"; 
private static String DIGEST = "MD5"; 

private static Cipher cipher; 
private static SecretKey password; 
private static IvParameterSpec IVParamSpec; 
private final static String pvtkey="GDNBCGDRFSC$%#%="; 

//16-byte private key 
private static byte[] IV = pvtkey.getBytes(); 

public PassWordEncryptor() { 
    try { 

     //Encode digest 
     MessageDigest digest;   
     digest = MessageDigest.getInstance(DIGEST);    
     password = new SecretKeySpec(digest.digest(pvtkey.getBytes()), ALGORITHM); 

     //Initialize objects 
     cipher = Cipher.getInstance(TRANSFORMATION); 
     IVParamSpec = new IvParameterSpec(IV); 

    } catch (NoSuchAlgorithmException e) { 
     Log.i(Lams4gApp.TAG, "No such algorithm " + ALGORITHM); 
    } catch (NoSuchPaddingException e) { 
     System.out.println("No such padding PKCS7"+ e); 
    } 
} 
/** 
Encryptor. 

@text String to be encrypted 
@return Base64 encrypted text 

*/ 
public String encrypt(byte[] text) { 

    byte[] encryptedData; 

    try { 

     cipher.init(Cipher.ENCRYPT_MODE, password, IVParamSpec); 
     encryptedData = cipher.doFinal(text); 

    } catch (InvalidKeyException e) { 
     System.out.println("Invalid key (invalid encoding, wrong length, uninitialized, etc)."+ e); 
     return null; 
    } catch (InvalidAlgorithmParameterException e) { 
     System.out.println("Invalid or inappropriate algorithm parameters for " + ALGORITHM+ e); 
     return null; 
    } catch (IllegalBlockSizeException e) { 
     System.out.println("The length of data provided to a block cipher is incorrect"+ e); 
     return null; 
    } catch (BadPaddingException e) { 
     System.out.println("The input data but the data is not padded properly."+ e); 
     return null; 
    }    
    return Base64.encodeToString(encryptedData,Base64.DEFAULT); 

} 

とiOSコード

- (NSData *)AES128Operation:(CCOperation)operation key:(NSString *)key iv:(NSString *)iv 
{ 
    char keyPtr[kCCKeySizeAES128 + 1]; 
    bzero(keyPtr, sizeof(keyPtr)); 
    //keyPtr = [58,-43,46,33,-105,83,-80,-5,99,59,2,109,63,89,-59,-91]; 
    key = [key MD5]; 
    [key getCString:keyPtr maxLength:sizeof(keyPtr) encoding:NSUTF8StringEncoding]; 

    char ivPtr[kCCBlockSizeAES128 + 1]; 
    bzero(ivPtr, sizeof(ivPtr)); 
    if (iv) { 
     [iv getCString:ivPtr maxLength:sizeof(ivPtr) encoding:NSUTF8StringEncoding]; 
    } 

    NSUInteger dataLength = [self length]; 
    size_t bufferSize = dataLength + kCCBlockSizeAES128; 
    void *buffer = malloc(bufferSize); 

    size_t numBytesEncrypted = 0; 
    CCCryptorStatus cryptStatus = CCCrypt(operation, 
              kCCAlgorithmAES128, 
              kCCOptionPKCS7Padding, 
              keyPtr, 
              kCCBlockSizeAES128, 
              ivPtr, 
              [self bytes], 
              dataLength, 
              buffer, 
              bufferSize, 
              &numBytesEncrypted); 
    if (cryptStatus == kCCSuccess) { 
     return [NSData dataWithBytesNoCopy:buffer length:numBytesEncrypted]; 
    } 
    free(buffer); 
    return nil; 
} 

like-結果は同じですされています。しかし、私がMD5をアンドロイドとiOSで使用した場合、結果は異なります。これは128 bitの場合にのみ問題です。256を使用すると結果はまったく同じになります。

助けてください。

答えて

0

これにはいくつかの問題があります。あなたのiOSのコードで

  1. 、あなただけでNSStringある keyMD5メソッドを呼び出すされ表示されます。あなたはそのクラスのためにMD5 ダイジェストを実装する必要があります。 Example implementation
  2. Javaコードでは、キーとキーの両方に同じ値を使用しています( IV)。これは非常に危険なであり、キーが漏れてしまう可能性があります。 のIVには、指定されたキーで暗号化されたすべてのメッセージに対して、一意のランダムで予測不可能な値を使用します。
  3. MD5は非常に弱い(実際には廃止され、「暗号安全」とはみなされない)ダイジェスト機能です。この場合、キー導出関数(KDF)として a キーから「人が読める」と「記憶可能な」入力(通常はパスワード)から導き出します。コモディティハードウェアでMD5の導出は簡単に数秒で簡単に強制されます。 bcrypt,scryptまたはPBKDF2 with HMAC/SHA-256を使用し、これらのキーを得るために高い作業係数を使用してください。
+0

ありがとう@Andy、私は同じことを確認します。どうもありがとうございます。 – Manish