gpt4 book ai didi

java - 我如何知道我是否使用了正确版本的 Triple Des 算法实现?

转载 作者:行者123 更新时间:2023-12-01 05:04:10 28 4
gpt4 key购买 nike

我在互联网上搜索了 Java 的 Triple Des 算法实现。

我找到了很多解决方案并选择了一个(对我来说有更好文档的那个)。我测试过,工作正常。

然后,我搜索了 Java 的 AES 算法实现。并找到了好的。与 Triple Des 算法实现非常相似,但并不完全相同。

所以我想,如果我使用 AES 算法实现但将 Cipher 实例参数从“AES”更改为“DESede”,会附加什么?我进行了更改,测试了代码并且工作正常。但是,返回的字符串与我之前的 Triple Des 算法实现中返回的字符串不同。

那么,就像标题所说,我如何知道我是否使用了正确版本的 Triple Des 算法实现?

这是第一个实现:

public String encrypt(SecretKey key, String stringIn){

String outString = "";

if (stringIn.isEmpty() || stringIn.toUpperCase().equals("NULL")){
return "";
}

try {

if (key == null)
key = this.key;


InputStream in = new ByteArrayInputStream(stringIn.getBytes("UTF-8"));

ByteArrayOutputStream out = new ByteArrayOutputStream();

// Create and initialize the encryption engine
Cipher cipher = Cipher.getInstance("DESede");
cipher.init(Cipher.ENCRYPT_MODE, key);

// Create a special output stream to do the work for us
CipherOutputStream cos = new CipherOutputStream(out, cipher);

// Read from the input and write to the encrypting output stream
byte[] buffer = new byte[2048];

int bytesRead;

while ((bytesRead = in.read(buffer)) != -1) {
cos.write(buffer, 0, bytesRead);
}

cos.close();

// For extra security, don't leave any plaintext hanging around memory.
java.util.Arrays.fill(buffer, (byte) 0);

outString = out.toString();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

return outString;
}

}

这是第二个:

public String encrypt(SecretKey key, String stringIn){

String outString = "";

if (stringIn.isEmpty() || stringIn.toUpperCase().equals("NULL")){
return "";
}


try {

if (key == null)
key = this.key;

Cipher ecipher = Cipher.getInstance("DESede");

ecipher.init(Cipher.ENCRYPT_MODE, key);

byte[] bytes = stringIn.getBytes("UTF8");

byte[] encVal = ecipher.doFinal(bytes);

outString = new sun.misc.BASE64Encoder().encode(encVal);

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (NoSuchAlgorithmException e) {

e.printStackTrace();

} catch (NoSuchPaddingException e) {

e.printStackTrace();

} catch (InvalidKeyException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

return outString;
}

}

这是测试用例:

    String In: 6985475896580019
String Returned when I Encripted with First code: Kœ¼i …€‡ä«‘]<žéù âpU
String Returned when I Encripted with Second code: w1ujopasjH6ccFKgUtOgansFNBtxbWe8YwDhso2pZN8=

抱歉我的英语不好。

感谢您的帮助

最佳答案

cipher.init(mode,key)生成随机 IV。这实际上是最安全的使用方式;你应该使用.getIV()并返回加密文本(这也是自动的;Java 将其附加到加密流的前几个字节上,这就是他们解密的方式)。不同的 IV 会像不同的 key 一样改变结果,但它不需要保密,只是为了确保相同的东西不会进行相同的加密。

要强制使用 IV 来比较算法,或使用未包含的已知算法进行解密,请使用 cipher.init(mode,key,new IvParameterSpec(iv))

关于java - 我如何知道我是否使用了正确版本的 Triple Des 算法实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12957022/

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