gpt4 book ai didi

java - 在 RSA ENCRYPTION(doFinal) 中需要帮助

转载 作者:搜寻专家 更新时间:2023-11-01 02:14:15 25 4
gpt4 key购买 nike

我正在尝试使用 RSA 算法加密和解密字符串。这里的加密工作正常,但问题出在解密上。 代码在到达 DECRYPT 方法中的 doFinal 时终止。我是输入错误还是公钥和私钥有问题?请给我一些建议。谢谢你。

public class rsa 
{
private KeyPair keypair;

public rsa() throws NoSuchAlgorithmException, NoSuchProviderException
{
KeyPairGenerator keygenerator = KeyPairGenerator.getInstance("RSA");
SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN");
keygenerator.initialize(1024, random);
keypair = keygenerator.generateKeyPair();
}
public String ENCRYPT(String Algorithm, String Data ) throws Exception
{
String alg = Algorithm;
String data=Data;
byte[] encrypted=new byte[2048];
if(alg.equals("RSA"))
{

PublicKey publicKey = keypair.getPublic();
Cipher cipher;
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
encrypted = cipher.doFinal(data.getBytes());
System.out.println("Encrypted String[RSA] -> " + encrypted);
}
return encrypted.toString();
}
public String DECRYPT(String Algorithm, String Data ) throws Exception
{
String alg = Algorithm;
byte[] Decrypted=Data.getBytes();


if(alg.equals("RSA"))
{

PrivateKey privateKey = keypair.getPrivate();
Cipher cipher;
cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
byte[] dec = cipher.doFinal(Decrypted);

System.out.println("Decrypted String[RSA] -> " + dec.toString());

}
return Decrypted.toString();
}
public static void main(String[] args) throws Exception
{
rsa RSA=new rsa();
RSA.ENCRYPT("RSA", "avinash");
RSA.DECRYPT("RSA","[B@cb7e2c");
}

 got exception as

Exception in thread "main" javax.crypto.BadPaddingException: Data must start with zero
at sun.security.rsa.RSAPadding.unpadV15(Unknown Source)
at sun.security.rsa.RSAPadding.unpad(Unknown Source)
at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356)
at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382)
at javax.crypto.Cipher.doFinal(Cipher.java:2086)
at EncryptionProvider.rsa.DECRYPT(rsa.java:56)
at EncryptionProvider.rsa.main(rsa.java:68)

加密字符串[RSA] -> [B@4a96a

最佳答案

[B@cb7e2c 不是您加密的输出。这是尝试在 byte[] 对象上打印或调用 toString() 的结果。 (比如看System.out.println(new byte[0]);的结果)

尝试将加密的 byte[] 直接送回解密函数,并使用 new String(dec) 打印结果。如果要以字符串形式查看/保存加密数据,请将其编码为十六进制或 base64。

区别就在这里。 byte[] 表示一个字节数组。它是二进制数据,一系列 8 位有符号数。如果您只习惯于使用 ascii,那么一系列 byteString 之间的区别可能看起来微不足道,但是有很多方法可以用二进制表示字符串.您正在执行的加密和解密根本不关心字符串的外观或数据是否表示字符串;它只是在看位。

如果要加密字符串,则需要将其转换为一系列字节。另一方面,一旦你解密了组成字符串的字节,你就需要将它们转换回来。 myString.getBytes()new String(myBytea) 通常是有效的,但有点草率,因为它们只使用默认编码。如果 Alice 的系统使用 utf-8 而 Bob 使用 utf-16,那么她的消息对他来说就没有多大意义。因此最好使用例如 myString.getBytes("utf-8")new String(myBytea,"utf-8") 来指定字符编码.

以下是我正在处理的项目中的一些函数,以及演示 main 函数:

import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.xml.bind.DatatypeConverter;

public class RSAExample {
private static byte[] h2b(String hex){
return DatatypeConverter.parseHexBinary(hex);
}
private static String b2h(byte[] bytes){
return DatatypeConverter.printHexBinary(bytes);
}

private static SecureRandom sr = new SecureRandom();

public static KeyPair newKeyPair(int rsabits) throws NoSuchAlgorithmException {
KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA");
generator.initialize(rsabits, sr);
return generator.generateKeyPair();
}

public static byte[] pubKeyToBytes(PublicKey key){
return key.getEncoded(); // X509 for a public key
}
public static byte[] privKeyToBytes(PrivateKey key){
return key.getEncoded(); // PKCS8 for a private key
}

public static PublicKey bytesToPubKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{
return KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(bytes));
}
public static PrivateKey bytesToPrivKey(byte[] bytes) throws InvalidKeySpecException, NoSuchAlgorithmException{
return KeyFactory.getInstance("RSA").generatePrivate(new PKCS8EncodedKeySpec(bytes));
}

public static byte[] encryptWithPubKey(byte[] input, PublicKey key) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(input);
}
public static byte[] decryptWithPrivKey(byte[] input, PrivateKey key) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException {
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
return cipher.doFinal(input);
}


public static void main(String[] args) throws Exception {
KeyPair kp = newKeyPair(1<<11); // 2048 bit RSA; might take a second to generate keys
PublicKey pubKey = kp.getPublic();
PrivateKey privKey = kp.getPrivate();
String plainText = "Dear Bob,\nWish you were here.\n\t--Alice";
byte[] cipherText = encryptWithPubKey(plainText.getBytes("UTF-8"),pubKey);
System.out.println("cipherText: "+b2h(cipherText));
System.out.println("plainText:");
System.out.println(new String(decryptWithPrivKey(cipherText,privKey),"UTF-8"));
}
}

关于java - 在 RSA ENCRYPTION(doFinal) 中需要帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10221411/

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