私が作成した一部のソフトウェアは、.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 はぐちゃぐちゃです :)