2016-07-06 15 views
0

ユニバーサルWindowsアプリケーションの下で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; 
} 

と暗号化のために、このコードを:

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.AesEcbを使用していたとき、私は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を使用して暗号化キーを取得しないでください。約100msの間、ランダムな塩でHMACを反復します(塩はハッシュと共に保存する必要があります)。 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)メソッドを呼び出すと、暗号化が実際に失敗しました。

関連する問題