java.security.spec.InvalidKeySpecException和java程序中不适当的密钥规范错误

作为项目实施的一部分,我做了:1。Generete DSA密钥2.使用AES加密私钥3.保存到文件4.打开文件并读取加密的私钥5.我试图转换读取值成主键格式

import java.security.spec.EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.security.Security; import java.io.File; import java.security.KeyFactory; import java.security.PrivateKey; import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.io.*; import java.security.*; import java.util.logging.Level; import java.util.logging.Logger; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; public class Pgm { public static void main(String[] args) { try { KeyPairGenerator dsa = KeyPairGenerator.getInstance("DSA"); SecureRandom random = new SecureRandom(); dsa.initialize(1024, random); KeyPair keypair = dsa.generateKeyPair(); PrivateKey privateKey = (PrivateKey) keypair.getPrivate(); byte[] key = " u   1Ù iw&a".getBytes(); Key aesKey = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); String currentDir = System.getProperty("user.dir"); // encrypt the text cipher.init(Cipher.ENCRYPT_MODE, aesKey); byte[] abc = privateKey.getEncoded(); byte[] encrypted = cipher.doFinal(abc); // System.out.println("len="+encrypted.length()); File dir = new File(currentDir); File private_file = new File(dir, "privatekey.txt"); if (!private_file.exists()) { private_file.createNewFile(); } FileOutputStream fileos = new FileOutputStream(private_file); ObjectOutputStream objectos = new ObjectOutputStream(fileos); objectos.writeObject(encrypted); objectos.close(); fileos.close(); File file_private = new File(dir, "privatekey.txt"); FileInputStream fileo = new FileInputStream(file_private); ObjectInputStream objos = new ObjectInputStream(fileo); Object obj = objos.readObject(); byte[] encrypted1 = (byte[]) obj; cipher.init(Cipher.DECRYPT_MODE, aesKey); String decrypted = new String(cipher.doFinal(encrypted1)); if (decrypted.equals(new String(abc))) System.out.println("true"); else System.out.println("false"); Signature tosign = Signature.getInstance("DSA"); byte[] val = decrypted.getBytes(); KeyFactory generator = KeyFactory.getInstance("DSA"); EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(val); PrivateKey privatekey1 = generator.generatePrivate(privateKeySpec); tosign.initSign(privatekey1); } catch (Exception e) { System.out.println("failed"); e.printStackTrace(); } } } 

当我尝试执行上面的代码时,它显示以下错误!

屏幕截图的输出屏幕

密文和密钥都应该由随机字节组成。 它们中的任何一个都不能用字符串1:1表示。 并非所有字节都表示特定字符编码的有效编码 。

相反,您应该直接使用字节数组。 如果需要实际文本,请使用hex或base 64 编码 。

您的代码使用密文作为字节和hex指定的密钥:

 import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.security.Key; import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.SecureRandom; import java.security.Signature; import java.security.spec.EncodedKeySpec; import java.security.spec.PKCS8EncodedKeySpec; import java.util.Arrays; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import codec.Hex; public class Pgm { public static void main(String[] args) { try { KeyPairGenerator dsa = KeyPairGenerator.getInstance("DSA"); SecureRandom random = new SecureRandom(); dsa.initialize(1024, random); KeyPair keypair = dsa.generateKeyPair(); PrivateKey privateKey = (PrivateKey) keypair.getPrivate(); byte[] key = Hex.decode("000102030405060708090A0B0C0D0E0F"); Key aesKey = new SecretKeySpec(key, "AES"); Cipher cipher = Cipher.getInstance("AES"); String currentDir = System.getProperty("user.dir"); // encrypt the text cipher.init(Cipher.ENCRYPT_MODE, aesKey); byte[] abc = privateKey.getEncoded(); byte[] encrypted = cipher.doFinal(abc); // System.out.println("len="+encrypted.length()); File dir = new File(currentDir); File private_file = new File(dir, "privatekey.txt"); if (!private_file.exists()) { private_file.createNewFile(); } FileOutputStream fileos = new FileOutputStream(private_file); ObjectOutputStream objectos = new ObjectOutputStream(fileos); objectos.writeObject(encrypted); objectos.close(); fileos.close(); File file_private = new File(dir, "privatekey.txt"); FileInputStream fileo = new FileInputStream(file_private); ObjectInputStream objos = new ObjectInputStream(fileo); Object obj = objos.readObject(); byte[] encrypted1 = (byte[]) obj; cipher.init(Cipher.DECRYPT_MODE, aesKey); byte[] decrypted = cipher.doFinal(encrypted1); if (Arrays.equals(decrypted, abc)) System.out.println("true"); else System.out.println("false"); Signature tosign = Signature.getInstance("DSA"); KeyFactory generator = KeyFactory.getInstance("DSA"); EncodedKeySpec privateKeySpec = new PKCS8EncodedKeySpec(decrypted); PrivateKey privatekey1 = generator.generatePrivate(privateKeySpec); tosign.initSign(privatekey1); } catch (Exception e) { System.out.println("failed"); e.printStackTrace(); } } }