在java中将字符串转换为密钥
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/20824136/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert String to Secret key in java
提问by rit tech
I have encrypted my file using DES algorithm and Stored tat DES Secretkey into database converting it into String. Now i want to Convert that String to Secretkey.
我已经使用 DES 算法加密了我的文件,并将 tat DES Secretkey 存储到数据库中,将其转换为字符串。现在我想将该字符串转换为 Secretkey。
Here is the code.
这是代码。
secret_key = KeyGenerator.getInstance("DES").generateKey();
alogrithm_specs = new IvParameterSpec(initialization_vector);
// set encryption mode ...
encrypt = Cipher.getInstance("DES/CBC/PKCS5Padding");
encrypt.init(Cipher.ENCRYPT_MODE, secret_key, alogrithm_specs);
//out.print("actual secret_key:"+secret_key);
String keyString = encoder.encode(secret_key.getEncoded());
//out.print("keyString:"+keyString);
byte[] encodedKey = decoder.decodeBuffer(keyString);
//out.print("byte[]:"+encodedKey);
secret_key= new SecretKeySpec(encodedKey,0,encodedKey.length, "DES");
//out.print("after encode & decode secret_key:"+secret_key);
Above code will convert String into key as below:
上面的代码将字符串转换为键,如下所示:
actual secret_key: 'com.sun.crypto.provider.DESKey@1807c'
keyString:hvsCa0XcXhY=
byte[]:[B@7c91fe
after encode & decode secret_key:'javax.crypto.spec.SecretKeySpec@1807c`
I want to Store that Secretkey into database by converting the key into String. Then while decrypting i want convert that String back to Key.
我想通过将密钥转换为字符串来将该密钥存储到数据库中。然后在解密时我想将该字符串转换回密钥。
回答by PopoFibo
You are seeing the object class and the hashcodes of 2 different instances sharing the same reference. If you want to confirm whether your key is getting decoded correctly, print the encoded version of the decoded key.
您会看到共享相同引用的 2 个不同实例的对象类和哈希码。如果您想确认您的密钥是否被正确解码,请打印已解码密钥的编码版本。
System.out.println("after encode & decode secret_key:" + Base64.encodeBase64String(secretKey.getEncoded()));
Here is the modified source which might help you confirm the keys are infact the same (please note I didn't have ecoder and decoder declarations available in your code above hence used a standard Base64):
这是修改后的源代码,可以帮助您确认密钥实际上相同(请注意,我在上面的代码中没有可用的编码器和解码器声明,因此使用了标准的 Base64):
SecretKey secretKey;
String stringKey;
try {
secretKey = KeyGenerator.getInstance("DES").generateKey();
// byte[] initialization_vector;
// IvParameterSpec alogrithm_specs = new
// IvParameterSpec(initialization_vector);
// set encryption mode ...
Cipher encrypt = Cipher.getInstance("DES/CBC/PKCS5Padding");
encrypt.init(Cipher.ENCRYPT_MODE, secretKey);
if (secretKey != null) {
stringKey = Base64.encodeBase64String(secretKey.getEncoded());
System.out.println("actual secret_key:" + stringKey);
byte[] encodedKey = Base64.decodeBase64(stringKey);
// out.print("byte[]:"+encodedKey);
secretKey = new SecretKeySpec(encodedKey, 0, encodedKey.length,
"DES");
System.out.println("after encode & decode secret_key:"
+ Base64.encodeBase64String(secretKey.getEncoded()));
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Outputs in both the sops are identical:
两个 sop 中的输出是相同的:
actual secret_key:dYBRc0Ok6dk=
after encode & decode secret_key:dYBRc0Ok6dk=