gpt4 book ai didi

java - 将字符串转为 AES 的 128 位 key

转载 作者:行者123 更新时间:2023-11-30 09:10:43 24 4
gpt4 key购买 nike

我想输入我自己的字符串变量,然后将其转换为 AES 算法加密/解密的 key 。我已经尝试了许多已知的方法,例如 UTF-8、base64、一些进行字节字符串转换和反之亦然的方法以及其他一些方法。虽然它们确实都可以工作,即使其中一些不能准确工作,但它们都以字节为单位转换字符串,但我想要的是输入类似“helloWorld”的内容并取回 AES 的 128 位 key 。由于字节不准确,我使用的任何内容都用于“无效 key 长度”。我需要做什么才能获得正确的字节?另外我想澄清一下,我想要的是 String 而不是 char 数组,因为我想稍后在我的程序中将其作为一个函数,以便用户可以在 key 被泄露时随意更改它。

更新:我编辑了这个例子,这是我到目前为止所拥有的,但仍然抛出关于参数和 key 长度的异常

    public class SHAHashingExample
{
private static byte[] keyValue;

public static void main(String[] args)throws Exception
{
String password = "123456";

MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(password.getBytes());

byte byteData[] = md.digest();
keyValue = md.digest();

//convert the byte to hex format method 1
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length/2; i++) {
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}

System.out.println("Hex format : " + sb.toString());

//convert the byte to hex format method 2
StringBuffer hexString = new StringBuffer();
for (int i=0;i<byteData.length/2;i++) {
String hex=Integer.toHexString(0xff & byteData[i]);
if(hex.length()==1) hexString.append('0');
hexString.append(hex);
}
System.out.println("Hex format : " + hexString.toString());

String k = "hello world";
String f = encrypt(k);
System.out.println(f);
String j = decrypt(f);
System.out.println(j);
}

public static String encrypt(String Data) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, key);
byte[] encVal = c.doFinal(Data.getBytes());
String encryptedValue = new BASE64Encoder().encode(encVal);
return encryptedValue;
}

public static String decrypt(String encryptedData) throws Exception {
Key key = generateKey();
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.DECRYPT_MODE, key);
byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedData);
byte[] decValue = c.doFinal(decordedValue);
String decryptedValue = new String(decValue);
return decryptedValue;
}

private static Key generateKey() throws Exception {
Key key = new SecretKeySpec(keyValue, "AES");
return key;
}
}

最佳答案

更新 2:事实证明,您对 Java Cipher 功能的许多组件的使用并不准确。在这里查看其他 SO 答案。

Java AES and using my own Key

更新 1:要使用下面的示例将 256 位值降低到 128 位,您可能想尝试以下方法:

// After you already have generated the digest
byte[] mdbytes = md.digest();
byte[] key = new byte[mdbytes.length / 2];

for(int I = 0; I < key.length; I++){
// Choice 1 for using only 128 bits of the 256 generated
key[I] = mdbytes[I];

// Choice 2 for using ALL of the 256 bits generated
key[I] = mdbytes[I] ^ mdbytes[I + key.length];
}

// Now use key as the input key for AES

原创:这是使用内置 Java API 对某些数据字节执行 SHA 哈希的一个很好的示例。

http://www.mkyong.com/java/java-sha-hashing-example/

Java 具有执行多种不同哈希类型的内置功能,您确实应该尝试利用其中一种,而不是尝试自己编写一种。也许使用最广泛的散列函数是 SHA 版本。有可以输出 128、256 和 512 位哈希输出的版本。

您所要求的是在所有技术层面上,使用您的密码登录系统的一般工作原理。系统永远不会真正存储您的实际文本密码,而是存储它的哈希值。当您(用户)输入密码时,系统会对您输入的内容执行实时哈希,并将实时生成的哈希与存储的哈希进行比较。这并没有增加让我们说使用该哈希作为对称加密的实际 key 组件的步骤。一般来说,良好的哈希确实可以生成用于实际对称加密/解密的 DECENT key Material 。

关于java - 将字符串转为 AES 的 128 位 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22410602/

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