2

私が作成した一部のソフトウェアは、.Net4.0 の Rijndael アルゴリズムを使用して、ライセンス情報の暗号化と復号化を行います。

問題は次のとおりです。プログラムは文字列を生成し、これを byte[] に変換します。この byte[] は、Rijndael で別の byte[] に暗号化されてから、他のコンピューターに転送されます。そこで、この暗号化された byte[] が再び復号化され、結果の byte[] が再び文字列に変換されて、そこから情報が取得されます。

基本的に、これは完全に正常に機能します...しかし、完璧ではないと思います。

私たちのオフィスには、別の方法で暗号化と復号化を行っているように見えるコンピューターが 1 台あります。

別のコンピューターで byte[] を復号化しようとすると、次のような結果が得られます。

{"Zeichenabstände sind ungültig und können nicht entfernt werden."}
 bei System.Security.Cryptography.RijndaelManagedTransform.DecryptData(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount, Byte[]& outputBuffer, Int32 outputOffset, PaddingMode paddingMode, Boolean fLast)
 bei System.Security.Cryptography.RijndaelManagedTransform.TransformFinalBlock(Byte[] inputBuffer, Int32 inputOffset, Int32 inputCount)
 bei System.Security.Cryptography.CryptoStream.FlushFinalBlock()
 bei System.Security.Cryptography.CryptoStream.Dispose(Boolean disposing)
 bei System.IO.Stream.Close()

暗号化を行うコードは次のようになります。

private byte[] EncryptBytes(byte[] originalBytes) {
    MemoryStream ms = new MemoryStream();
    Rijndael crypt = Rijndael.Create();
    crypt.Key = KeyBytes;
    crypt.IV = IVBytes;
    CryptoStream cs = new CryptoStream(ms, crypt.CreateEncryptor(), CryptoStreamMode.Write);
    cs.Write(originalBytes, 0, originalBytes.Length);
    cs.Close();
    Byte[] cryptedBytes = ms.ToArray();
    ms.Close();
    return cryptedBytes;
}

復号化の場合も同じですが、CreateEncryptor() の代わりに CreateDecryptor() を使用するだけです。

問題をテストして解決するために、次のことを行いました。

両方のコンピューターで、まったく同じ文字列を暗号化しました。この文字列が両方のマシンでまったく同じ byte[] に変換されることを確認しました。Rijndael オブジェクトは両方のマシンで同じプロパティ値を持っているため、同じように構成されています (キー、IV、パディングなど)。

その後の暗号化された byte[] 出力は、両方のマシンで完全に異なります。

これは私が立ち往生しているところです。この行動の理由が思い浮かびませんし、インターネットも役に立ちませんでした。どちらのコンピュータも、Windows XP x86 と .Net4.0 を実行しています。

私はどんなヒントにも非常に感謝しており、前もってありがとう、mls

楽しい事実: 12 台の異なるコンピューターで問題なく動作しましたが、マシン 13 はぐちゃぐちゃです :)

4

1 に答える 1

1

メッセージの意味は

Padding is invalid and cannot be removed

暗号化されている実際のデータは異なると思います。同じであると想定される場合、違いはエンコーディングにある可能性があります。システム ロケール (System.Globalization.Culture および CurrentCulture) と同様に、システムの既定のエンコーディングは異なる可能性があると思います。

とにかく、ケースの 1 つで、パディングが正しくありません。暗号化をサポートするには、Rijndael の入力を特定のサイズにパディングする必要があります。Rijndael crypt のドキュメントを確認してください。

おそらく、入力を自動的にデフォルトでパディングするために使用できるフラグがあります(ソースだけでなく、ソース+パディングが返されるため、復号化するときにこれに注意してください)

于 2012-10-09T11:42:32.507 に答える