2016-11-24 2 views
0

Android 애플리케이션에 AES/CBC/PKCS5Padding을 사용하고 있습니다. 코드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); 

} 

'예요 그리고 아이폰 OS 코드 내가 모두 코드 MD5 digest를 사용하지 않는 경우

- (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; 
} 

결과는 동일합니다 같은 -. 하지만 안드로이드와 iOS에서 MD5을 사용하면 결과는 다릅니다. 을 사용하면 결과는 정확히 동일합니다. 이는 128 bit에만 해당되는 문제입니다.

도와주세요.

답변

0

여기에는 여러 가지 문제가 있습니다. 당신의 아이폰 OS 코드에서

  1. 는, 당신이 단지 NSString입니다 key,에 MD5 메소드를 호출되어 나타납니다. 해당 클래스에 대해 MD5 다이제스트를 구현해야합니다. Example implementation
  2. Java 코드에서 키와 IV에 동일한 값을 사용하고 있습니다. 이것은 이며 매우 위험합니다. 키가 누출 될 수 있습니다. 값입니다. 지정된 키로 암호화 된 모든 메시지 에 대해 IV에 대해 고유 한 임의의 예측할 수없는 값을 사용하십시오.
  3. MD5는 매우 약하며 (실제로는 권장되지 않으며 "암호 학적으로 안전한"것으로 간주되지 않음) 다이제스트 기능입니다. 이 경우 키 유도 함수 (KDF)로 사용하여 "인간이 읽을 수 있고 기억하기 쉬운"입력 (일반적으로 암호)을 파생시킵니다. MD5 파생은 상용 하드웨어에서 몇 초 만에 쉽게 무차별 적으로 강제 될 것입니다. 이러한 키를 유도하려면 bcrypt, scrypt 또는 PBKDF2 with HMAC/SHA-256과 높은 작업 계수를 사용하십시오.
+0

감사합니다. @ 앤디, 나는 똑같이 검사 할 것입니다. 정말 고맙습니다. – Manish