2016-07-06 4 views
0

유니버설 윈도우 응용 프로그램에서 AES128-EBC 암호화 문자열 검색에 도움이 필요합니다.
키로 사용되는 문자열에 암호가 있습니다. 32 비트 길이의 MD5 해시 값으로 AES128-EBC로 텍스트를 암호화하고 싶습니다. 는 지금은 MD5Hash를 만드는이 사용하고 있습니다 :UES의 AES128-ECB

public string GetMD5Hash(String strMsg) 
{ 
    string strAlgName = HashAlgorithmNames.Md5; 
    IBuffer buffUtf8Msg = CryptographicBuffer.ConvertStringToBinary(strMsg, BinaryStringEncoding.Utf8); 

    HashAlgorithmProvider objAlgProv = HashAlgorithmProvider.OpenAlgorithm 
    string strAlgNameUsed = objAlgProv.AlgorithmName; 

    IBuffer buffHash = objAlgProv.HashData(buffUtf8Msg); 

    if (buffHash.Length != objAlgProv.HashLength) 
    { 
     throw new Exception("There was an error creating the hash"); 
    } 

    string hex = CryptographicBuffer.EncodeToHexString(buffHash); 

    return hex; 
} 

그리고이 코드를 암호화 : 저는 출력 문자열이 비어 SymmetricAlgorithmNames.AesEcb을 사용하고 때

public string Encrypt(string input, string pass) 
{ 
    SymmetricKeyAlgorithmProvider provider = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcbPkcs7); 
    CryptographicKey key; 

    string encrypted = ""; 

    byte[] keyhash = Encoding.ASCII.GetBytes(GetMD5Hash(pass)); 
    key = provider.CreateSymmetricKey(CryptographicBuffer.CreateFromByteArray(keyhash)); 

    IBuffer data = CryptographicBuffer.CreateFromByteArray(Encoding.Unicode.GetBytes(input)); 
    encrypted = CryptographicBuffer.EncodeToBase64String(CryptographicEngine.Encrypt(key, data, null)); 

    return encrypted; 
} 

내가 SymmetricAlgorithmNames.AesEcbPkcs7을 사용하고 이유를 원인입니다. 나는 왜 그런지 이해하지 못한다. 제 질문은 : 내 코드가 AES128-ECB 암호화를 생성합니까? 왜냐하면 나는 그것이 정말로 확실하지 않기 때문이다. 암호화 된 데이터를 기다리는 소프트웨어가이를 인식하지 못하기 때문에 해독 할 수 없습니다.

+0

보안이 필요한 경우 : 1. ECB 모드를 사용하지 마십시오. 너무 안전하지 않습니다. [ECB 모드] (https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation#Electronic_Codebook_.28ECB.29)를 참조하십시오. 펭귄에게. 임의의 iv와 함께 CBC 모드를 사용하고 암호화 된 데이터 앞에 추가합니다. 2. MD5를 사용하여 암호화 키를 얻지 마십시오. HMAC를 무작위 소금으로 약 100ms 동안 반복하십시오 (소금은 해시와 함께 저장해야합니다). password_hash, PBKDF2, Bcrypt 및 유사한 기능과 같은 기능을 사용하십시오. 요점은 공격자가 무차별 적으로 암호를 찾는 데 많은 시간을 소비하게하는 것입니다. – zaph

+0

@zaph 유감스럽게도 ECB 또는 다른 UWP 누락 조각에 따라 IETF 표준이 있습니다. 항상 다른 것을 사용할 수는 없습니다. –

+0

@LexLi 개발자가 실행하는 몇 가지 동일한 코드 이외의 다른 이유없이 많은 사용법이 있습니다. IOW, ECB 모드를 사용하는 이유를 이해해야합니다. 여기에 암호 키 유도에 사용되는 MD5 해시도 있습니다. ECB 모드가 좋은 이유나 이해없이 사용된다고 가정하고 있습니다. – zaph

답변

0

내 질문 : 내 코드가 AES128-ECB 암호화를 생성합니까? 왜냐하면 나는 그것이 정말로 확실하지 않기 때문이다. 암호화 된 데이터를 기다리는 소프트웨어가이를 인식하지 못하기 때문에 해독 할 수 없습니다.

예, 코드가 ECB 암호 모드 및 PKCS7 패딩으로 AES 암호화를 만듭니다. 귀하의 문제를 정확하게 이해하면 AesEcbPkcs7와 작동하지만, AesEcb을 사용하지 못했습니다. 해독을위한 소프트웨어가 작동하지 않습니다.

AesEcbPkcs7AesEcb 차이점은 자동 AesEcbPkcs7 사용 PKCS # 7 블록 패딩 모드, PKCS # 7 알고리즘 인는의 배수 패드 암호화를하지 않아도, 적당한 길이로 메시지를 패딩하는 사용중인 알고리즘의 블록 크기. 그러므로 AesEcb을 사용하여 암호화한다면, AesEcbPkcs7을 사용하는 것이 좋습니다. 그렇지 않으면 제공된 사용자 버퍼가 요청 된 작업에 유효하지 않습니다.

암호 해독 소프트웨어에 여기있는 한 가지 가능성은 AesEcbPkcs7을 사용할 수 있지만 AesEcb의 해독을 구현하지 않은 것 같습니다. 내가 AesEcb를 사용하여 사용자 버퍼가 요청 된 작업에 적합하지 않습니다 때 예외를 잡을 생각하는 또 다른 가능성

public string Decrypt(string input, string pass) 
{ 
    var keyHash = Encoding.ASCII.GetBytes(GetMD5Hash(pass)); 

    // Create a buffer that contains the encoded message to be decrypted. 
    IBuffer toDecryptBuffer = CryptographicBuffer.DecodeFromBase64String(input); 

    // Open a symmetric algorithm provider for the specified algorithm. 
    SymmetricKeyAlgorithmProvider aes = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesEcb); 

    // Create a symmetric key. 
    var symetricKey = aes.CreateSymmetricKey(keyHash.AsBuffer()); 

    var buffDecrypted = CryptographicEngine.Decrypt(symetricKey, toDecryptBuffer, null); 

    string strDecrypted = CryptographicBuffer.ConvertBinaryToString(BinaryStringEncoding.Utf8, buffDecrypted); 

    return strDecrypted; 
} 

을 때 당신이 그것을 처리 : 여기 당신의 코드를 기반으로 암호 해독 테스트,이 코드가 제대로 AesEcb 암호를 해독 할 수 있습니다 Encrypt(string input, string pass) 메서드를 호출하면 실제로 암호화가 실패합니다.