首页 新闻 搜索 专区 学院

JAVA RSA加密问题:公匙解密失败 使用私匙加密获得的密文用公匙解密失败

0
悬赏园豆:20 [已关闭问题] 关闭于 2015-09-27 17:34

相关代码如下:

public static final String PUBLIC_KEY = "RSAPublicKey";//公钥
public static final String PRIVATE_KEY = "RSAPrivateKey";//私钥

/**
* 初始化密钥
* @return
* @throws Exception
*/
public static Map<String,Object> initKey()throws Exception{
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();

//公钥
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
//私钥
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();

Map<String,Object> keyMap = new HashMap<String, Object>(2);
keyMap.put(PUBLIC_KEY, publicKey);
keyMap.put(PRIVATE_KEY, privateKey);

return keyMap;
}
/**
* 取得公钥,并转化为String类型
* @param keyMap
* @return
* @throws Exception
*/
public static String getPublicKey(Map<String, Object> keyMap)throws Exception{
Key key = (Key) keyMap.get(PUBLIC_KEY);
return Base64.encodeBase64String(key.getEncoded());
}

/**
* 取得私钥,并转化为String类型
* @param keyMap
* @return
* @throws Exception
*/
public static String getPrivateKey(Map<String, Object> keyMap) throws Exception{
Key key = (Key) keyMap.get(PRIVATE_KEY);
return Base64.encodeBase64String(key.getEncoded());
}

/**
* 用私钥加密
* @param data 数据
* @param key 密钥
* @return
* @throws Exception
*/
public static byte[] encryptByPrivateKey(byte[] data,String key)throws Exception{
//解密密钥
byte[] keyBytes = Base64.decodeBase64(key);
//取私钥
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
//对数据加密
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(1, privateKey);

return cipher.doFinal(data);
}

/**
* 用公钥解密
* @param data 加密数据
* @param key 密钥
* @return
* @throws Exception
*/
public static byte[] decryptByPublicKey(byte[] data, String key)
throws Exception
{
byte[] keyBytes = Base64.decodeBase64(key);

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
Key publicKey = keyFactory.generatePublic(x509KeySpec);
Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());
cipher.init(2, publicKey);

return cipher.doFinal(data);
}

public static void test(){
try{
String publicKey=getPublicKey(initKey());
String privateKey=getPrivateKey(initKey());
System.out.println("私钥加密——公钥解密");
String inputStr = "sign";
byte[] data = inputStr.getBytes("utf-8");

byte[] encodedData = encryptByPrivateKey(data, privateKey);

byte[] decodedData = decryptByPublicKey(encodedData, publicKey);

String outputStr = new String(decodedData);
System.out.println("加密前: " + inputStr + "nr" + "解密后: " + outputStr);
}
catch (Exception e)
{
e.printStackTrace();
}

}

调试反馈错误详情:

javax.crypto.BadPaddingException: Decryption error
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:389)
at javax.crypto.Cipher.doFinal(Cipher.java:2165)
at decryptByPublicKey(Signaturer.java:130)

Hawker的主页 Hawker | 初学一级 | 园豆:159
提问于:2015-09-27 13:01
< >
分享
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册