0

ユニバーサル Windows アプリケーションで AES128-EBC 暗号化文字列を取得する際に助けが必要です。
キーとして使用される文字列のパスワードがあります。長さ 32 ビットの MD5 ハッシュ値を使用して、テキストを AES128-EBC で暗号化したいと考えています。今、私は MD5Hash を作成するためにこれを使用しています:

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.AesEcbPkcs7私が使用している理由はSymmetricAlgorithmNames.AesEcb、出力文字列が空である場合です。理由がわかりません。私の質問は: 私のコードは AES128-ECB 暗号化を作成しますか? 私は本当にそうかどうかわからないからです。その暗号化されたデータを待っているソフトウェアはそれを認識しないため、復号化できません。

4

1 に答える 1

0

私の質問は: 私のコードは AES128-ECB 暗号化を作成しますか? 私は本当にそうかどうかわからないからです。その暗号化されたデータを待っているソフトウェアはそれを認識しないため、復号化できません。

はい、コードは ECB 暗号モードと PKCS7 パディングを使用して AES 暗号化を作成します。私があなたの問題を正しく理解していれば、これは で動作するとおっしゃいましAesEcbPkcs7たが、 を使用できAesEcbませんでした。復号化用のソフトウェアはこれには機能しません。

AesEcbPkcs7との違いAesEcbは、AesEcbPkcs7PKCS#7 ブロック パディング モードを使用し、PKCS #7 アルゴリズムがメッセージを適切な長さに自動的にパディングするため、アルゴリズムのブロック サイズの倍数まで暗号をパディングする必要がないことです。使用しています。したがって、AesEcb暗号化にどうしても使用したい場合は、`AesEcbPkcs7 を使用することをお勧めします。それ以外の場合は例外です。指定されたユーザー バッファは、要求された操作に対して有効ではありません。

したがって、ここでの復号化ソフトウェアの1つの可能性は、を使用する機能があるかもしれませんが、の復号化を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)、暗号化が実際に失敗した可能性があります。

于 2016-07-07T10:04:22.543 に答える