gpt4 book ai didi

java - 使用 Java 解密 3Des 中的值

转载 作者:行者123 更新时间:2023-11-30 04:47:30 25 4
gpt4 key购买 nike

我在解密来自使用 3Des 的第三方的值时遇到问题。他们给了我一个 key 、一个加密值、使用的模式以及解密值应该是什么,但到目前为止我还无法弄清楚如何从 a 点到达 b 点。我相信问题与他们给我的 key 有关 - 他们说这是明文 key ,但我认为它仍然需要以某种方式进一步转换。

下面的代码是我最初尝试了解如何解密该值的示例(在本例中为 AC9C5A46A63FC9EA)

如有任何见解,我们将不胜感激。

import java.security.spec.KeySpec;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESedeKeySpec;

public class TripleDes2 {

private static final String UNICODE_FORMAT = "UTF8";
private static final String DESEDE_ENCRYPTION_SCHEME = "DESede";
private static final String CIPHER_ALG = "DESede/ECB/Nopadding"; //assuming no padding
private KeySpec ks;
private SecretKeyFactory skf;
private Cipher cipher;
private byte[] arrayBytes;
private String myEncryptionKey;
private SecretKey key;

public static void main(String args []) throws Exception {
TripleDes2 td= new TripleDes2();

String decrypted = td.decrypt("AC9C5A46A63FC9EA");
System.out.println("expecting: 04286EDDFDEA6BD7");
System.out.println("found: " + decrypted);
}

public TripleDes2() throws Exception {
myEncryptionKey = "1032FD2CD64A9D7FA4D061F76B04BFEA";
arrayBytes = myEncryptionKey.getBytes(UNICODE_FORMAT);
ks = new DESedeKeySpec(arrayBytes);
skf = SecretKeyFactory.getInstance(DESEDE_ENCRYPTION_SCHEME);

cipher = Cipher.getInstance(CIPHER_ALG);
key = skf.generateSecret(ks);
}

public String decrypt(String encryptedString) {
String decryptedText=null;
try {
cipher.init(Cipher.DECRYPT_MODE, key);
byte[] encryptedText = encryptedString.getBytes();
byte[] plainText = cipher.doFinal(encryptedText);
decryptedText= new String(plainText);
} catch (Exception e) {
e.printStackTrace();
}
return decryptedText;
}
}

最佳答案

您使用 SecretKeyFactory 等使其变得比您需要的更复杂。但主要问题是您没有正确转换十六进制数字。

class TripleDES
{

private final String key;

public static void main(String... args)
throws Exception
{
TripleDES td = new TripleDES("1032FD2CD64A9D7FA4D061F76B04BFEA");
String decrypted = td.decrypt("AC9C5A46A63FC9EA");
System.out.println("expecting: 04286EDDFDEA6BD7");
System.out.println("found: " + decrypted);
}

TripleDES(String key)
{
this.key = key;
}

public String decrypt(String input)
throws Exception
{
byte[] tmp = h2b(this.key);
byte[] key = new byte[24];
System.arraycopy(tmp, 0, key, 0, 16);
System.arraycopy(tmp, 0, key, 16, 8);
Cipher cipher = Cipher.getInstance("DESede/ECB/NoPadding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(key, "DESede"));
byte[] plaintext = cipher.doFinal(h2b(input));
return b2h(plaintext);
}

private static byte[] h2b(String hex)
{
if ((hex.length() & 0x01) == 0x01)
throw new IllegalArgumentException();
byte[] bytes = new byte[hex.length() / 2];
for (int idx = 0; idx < bytes.length; ++idx) {
int hi = Character.digit((int) hex.charAt(idx * 2), 16);
int lo = Character.digit((int) hex.charAt(idx * 2 + 1), 16);
if ((hi < 0) || (lo < 0))
throw new IllegalArgumentException();
bytes[idx] = (byte) ((hi << 4) | lo);
}
return bytes;
}

private static String b2h(byte[] bytes)
{
char[] hex = new char[bytes.length * 2];
for (int idx = 0; idx < bytes.length; ++idx) {
int hi = (bytes[idx] & 0xF0) >>> 4;
int lo = (bytes[idx] & 0x0F);
hex[idx * 2] = (char) (hi < 10 ? '0' + hi : 'A' - 10 + hi);
hex[idx * 2 + 1] = (char) (lo < 10 ? '0' + lo : 'A' - 10 + lo);
}
return new String(hex);
}

}

关于java - 使用 Java 解密 3Des 中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10623402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com