C# で何かを暗号化するのに苦労しています。
私は3つの変数を持っています。最初のものは 16 桁の 16 進数です。X 値と呼びましょう。
DES-ECB 暗号化のキーを取得するには、これら 2 つの値を XOR する必要があります。
したがって、結果は 307a66934068666f になります。これが暗号化用のキーブロックです。次に、これをデータブロックとして使用します。これは、暗号化用の 64 ビットです 0E329232EA6D0D73
今、これを暗号化するための次のコードがあります。暗号化の結果は、再びデータブロックと XOR され、64 ビットの結果になります。これはそうではありません。
これは暗号化のための私のコードです
$ public static string DESEncrypt(string keyBlock,string dataBlock){
DES desEncrypt = new DESCryptoServiceProvider();
byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16));
byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16));
desEncrypt.Mode = CipherMode.ECB;
desEncrypt.Key = keyBlockBytes;
ICryptoTransform transForm = desEncrypt.CreateEncryptor();
MemoryStream enecryptedStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write);
cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedData = new byte[enecryptedStream.Length];
enecryptedStream.Position = 0;
enecryptedStream.Read(encryptedData, 0, encryptedData.Length);
string enCryptedHex = BitConverter.ToString(encryptedData);
return enCryptedHex.Replace("-","");
}
私は何を間違っていますか?
更新された質問 CodeInChaos の上記のソリューションをテストしました。それは私に64ビットの結果を返します。しかし、まだ何か問題があります。
これが私の更新されたコードです。
キーブロック値は abababababababab で、データ ブロック値は 215135734068666F です。
結果の 64 ビットの結果は、データ ブロックと再度 XOR する必要があります。
最終的な答えは 414945DD33C97C47 と思われますが、288a08c01a57ed3d になります。
なぜ正しく出ないのですか?
これは、暗号化に関するサプライヤ ドキュメントの仕様です。
暗号化は FIPS 46-3 に準拠した DEA、ECB モードの単一 DES、奇数パリティ付きの単一の 64 ビット DES キーを使用します。
$ public static string DESEncrypt(string keyBlock,string dataBlock){
DES desEncrypt = new DESCryptoServiceProvider();
byte[] keyBlockBytes = BitConverter.GetBytes(Convert.ToInt64(keyBlock, 16));
byte[] dataBlockBytes = BitConverter.GetBytes(Convert.ToInt64(dataBlock, 16));
desEncrypt.Mode = CipherMode.ECB;
desEncrypt.Key = keyBlockBytes;
desEncrypt.Padding = PaddingMode.None;
ICryptoTransform transForm = desEncrypt.CreateEncryptor();
MemoryStream enecryptedStream = new MemoryStream();
CryptoStream cryptoStream = new CryptoStream(enecryptedStream, transForm, CryptoStreamMode.Write);
cryptoStream.Write(dataBlockBytes, 0, dataBlockBytes.Length);
cryptoStream.FlushFinalBlock();
byte[] encryptedData = enecryptedStream.ToArray();
string enCryptedHex = BitConverter.ToString(encryptedData);
enCryptedHex = enCryptedHex.Replace("-", "");
long iDeaEncrypt = Convert.ToInt64(enCryptedHex, 16);
long iDataBlock = Convert.ToInt64(dataBlock, 16);
long decoderKey = iDeaEncrypt ^ iDataBlock;
string decKeyHex = Convert.ToString(decoderKey, 16);
return decKeyHex;
}