java非对称加密如何生成密钥对?
How to generate key pair in asymmetric encryption in java?
我正在尝试在 Java 中生成非对称加密的密钥对,但出现 invalid key exception
错误,它显示 No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl
.
private static byte[] encrypt(byte[] inpBytes, PrivateKey prvk,
String xform) throws Exception {
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.ENCRYPT_MODE, prvk);
return cipher.doFinal(inpBytes);
}
@Override
public byte[] uploadFile(byte[] data, String name, String file, int size)
throws RemoteException {
// TODO Auto-generated method stub
byte[] keyss=null;
try {
OutputStream out =
new FileOutputStream(new File("C:\Users\Amaresh\Documents\Cloud\"
+ name + "\" + file));
String xform = "DES/CTR/NoPadding";
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // Original
kpg.initialize(1024); // 512 is the keysize.//try 1024 biit
KeyPair kp = kpg.genKeyPair();
PublicKey pubk = kp.getPublic();
PrivateKey prvk = kp.getPrivate();
keyss = pubk.getEncoded();
byte[] encBytes = encrypt(data, prvk, xform);
System.out.println("Keypair generated");
out.write(encBytes, 0, encBytes.length);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return keyss;
}
我只想进行非对称加密,我使用私钥加密数据并存储 public 密钥以对其进行解密。我是初学者,很抱歉我的直率错误。
DES 密码不支持 RSA 密钥。 DES 是一种对称密码算法,而 RSA 是非对称的。对称密码需要使用相同的密钥进行加密和解密,而不对称密码使用 public/private 密钥对。
您有两种选择来让您的加密工作:
您可以使用当前的对称密码并创建一个对称密钥(可能使用 KeyGenerator)
您可以将密码实例更改为非对称实例,例如 "RSA"
。
String xform = "RSA";
注:
您要做的不是加密,而是签名,因为加密将使用 public 密钥完成。
此外,您不应该通过非对称模式加密整个文件,而只能使用对称密钥加密和解密您的数据。参见 http://en.wikipedia.org/wiki/Public-key_cryptography#Computational_cost。
您正在正确生成密钥。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keys = kpg.generateKeyPair();
问题出在你的:
byte[] encBytes = encrypt(data, prvk, xform);
很可能是因为您正在传递字符串 "DES/CTR/NoPadding"。您不能使用带有 RSA 密钥对的 DES 进行加密。
我正在尝试在 Java 中生成非对称加密的密钥对,但出现 invalid key exception
错误,它显示 No installed provider supports this key: sun.security.rsa.RSAPrivateCrtKeyImpl
.
private static byte[] encrypt(byte[] inpBytes, PrivateKey prvk,
String xform) throws Exception {
Cipher cipher = Cipher.getInstance(xform);
cipher.init(Cipher.ENCRYPT_MODE, prvk);
return cipher.doFinal(inpBytes);
}
@Override
public byte[] uploadFile(byte[] data, String name, String file, int size)
throws RemoteException {
// TODO Auto-generated method stub
byte[] keyss=null;
try {
OutputStream out =
new FileOutputStream(new File("C:\Users\Amaresh\Documents\Cloud\"
+ name + "\" + file));
String xform = "DES/CTR/NoPadding";
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA"); // Original
kpg.initialize(1024); // 512 is the keysize.//try 1024 biit
KeyPair kp = kpg.genKeyPair();
PublicKey pubk = kp.getPublic();
PrivateKey prvk = kp.getPrivate();
keyss = pubk.getEncoded();
byte[] encBytes = encrypt(data, prvk, xform);
System.out.println("Keypair generated");
out.write(encBytes, 0, encBytes.length);
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchProviderException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return keyss;
}
我只想进行非对称加密,我使用私钥加密数据并存储 public 密钥以对其进行解密。我是初学者,很抱歉我的直率错误。
DES 密码不支持 RSA 密钥。 DES 是一种对称密码算法,而 RSA 是非对称的。对称密码需要使用相同的密钥进行加密和解密,而不对称密码使用 public/private 密钥对。
您有两种选择来让您的加密工作:
您可以使用当前的对称密码并创建一个对称密钥(可能使用 KeyGenerator)
您可以将密码实例更改为非对称实例,例如
"RSA"
。String xform = "RSA";
注:
您要做的不是加密,而是签名,因为加密将使用 public 密钥完成。
此外,您不应该通过非对称模式加密整个文件,而只能使用对称密钥加密和解密您的数据。参见 http://en.wikipedia.org/wiki/Public-key_cryptography#Computational_cost。
您正在正确生成密钥。
KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA");
kpg.initialize(1024);
KeyPair keys = kpg.generateKeyPair();
问题出在你的:
byte[] encBytes = encrypt(data, prvk, xform);
很可能是因为您正在传递字符串 "DES/CTR/NoPadding"。您不能使用带有 RSA 密钥对的 DES 进行加密。