-1

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;
    }
4

2 に答える 2

0

パディングを次のように設定する必要があると思いますPaddingMode.None

desEncrypt.Padding = PaddingMode.None;

しかし、DES と ECB が本当に必要な場合は、真剣に検討する必要があります。


ところで

byte[] encryptedData = new byte[enecryptedStream.Length];
encryptedStream.Position = 0;
encryptedStream.Read(encryptedData, 0, encryptedData.Length);

次のように置き換えることができます:

encryptedData = encryptedStream.ToArray();
于 2012-05-25T08:27:53.727 に答える
0

DEA が FIPS 46-3 で規定されている順列テーブルなどを使用するように、DES プロバイダーを FIPS 46-3 標準を使用するように設定する必要があるかもしれません。残念ながら、私もこの同じ問題に苦しんでいます。

于 2014-10-22T10:59:42.727 に答える