0

第三者によって暗号化されたカードパンを受け取りました。彼らはJavaを使用して、48文字のキーを使用してパンを暗号化しました.

オンライン ツールを使用すると、彼らが見ているのと同じ結果を得ることができます。しかし、コードでは、「指定されたキーは、このアルゴリズムに対して有効なサイズではありません」というメッセージが表示されます。エラーメッセージ。

この問題を回避する方法を教えてください。

以下のコードスニペット

    private void button1_Click(object sender, EventArgs e)
    {
        byte[] Results;
        UTF8Encoding UTF8 = new UTF8Encoding();

        MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider();
        byte[] TDESKey = UTF8Encoding.UTF8.GetBytes(key.Text);

        TripleDESCryptoServiceProvider TDESAlgorithm = new TripleDESCryptoServiceProvider();

        TDESAlgorithm.IV = new byte[TDESAlgorithm.BlockSize / 8];
        TDESAlgorithm.Key = TDESKey;
        TDESAlgorithm.Mode = CipherMode.ECB;
        TDESAlgorithm.Padding = PaddingMode.PKCS7;

        byte[] DataToDecrypt = Convert.FromBase64String(decrypt.Text);

        try
        {
            ICryptoTransform Decryptor = TDESAlgorithm.CreateDecryptor();
            Results = Decryptor.TransformFinalBlock(DataToDecrypt, 0, DataToDecrypt.Length);
        }
        finally
        {
            TDESAlgorithm.Clear();

        }

      decryptedText.Text =  UTF8.GetString(Results);


    }

以下の暗号化に使用されるコード

public static String encryptData(String toEncrypt, byte[] sharedKeyBytes){
    byte[] encrypted = new byte[0];
    try {
        DESedeKeySpec keySpec = new DESedeKeySpec(sharedKeyBytes);

        SecretKey key = SecretKeyFactory.getInstance(ALGORITHM_DESEDE).generateSecret(keySpec);
        Cipher encrypter = Cipher.getInstance(TRANSFORMSATION_DESEDE_PADDED);
        encrypter.init(Cipher.ENCRYPT_MODE, key);

        byte[] input = toEncrypt.getBytes(UTF_8);

        encrypted = encrypter.doFinal(input);
    } catch (Exception e) {
        throw new CryptoException("Exception caught when encrypting", e);
    }
    return new String(Base64.encodeBase64(encrypted));
}

これは、C# で生成する必要があるものと同等です。このコードはJavaで動作します

public static String decryptTripleDES(String toDecrypt, byte[] customerSharedKeyBytes){
    byte[] decrypted = new byte[0];

    System.out.println(customerSharedKeyBytes.length);
    try {
        byte[] decodedValue = Base64.decodeBase64(toDecrypt.getBytes(UTF_8));

        DESedeKeySpec keySpec = new DESedeKeySpec(customerSharedKeyBytes);

        SecretKey key = SecretKeyFactory.getInstance(ALGORITHM_DESEDE).generateSecret(keySpec);
        Cipher decrypter = Cipher.getInstance(TRANSFORMSATION_DESEDE_PADDED);
        decrypter.init(Cipher.DECRYPT_MODE, key);

        decrypted = decrypter.doFinal(decodedValue);
    } catch (Exception e) {
        throw new CryptoException("Exception caught when decrypting", e);
    }

    return new String(decrypted);
}

この問題を回避する最善の方法についてアドバイスしてください。

ありがとう

4

2 に答える 2

0

ご回答ありがとうございます。

上記で概説したように、3DES キーの長さは 24 バイトである必要があります。キーの最初の 24 文字をキー バイトに変換し、それを 3DES キーに割り当てました。その後、これは期待どおりに機能しました。Java は、少し奇妙である c# と比較して寛大であるように見えます。サードパーティは 48 文字のキーを使用していますが、アルゴリズムは Java の最初の 24 文字を超えるものを破棄するようですが、苦情や実行時エラーをスローしません。

返信ありがとうございます

于 2013-07-25T08:00:29.330 に答える