JAVA公钥加密,私钥解密,该怎么解决

Python016

JAVA公钥加密,私钥解密,该怎么解决,第1张

public abstract class RSACoder extends Coder {

public static final String KEY_ALGORITHM = "RSA"

public static final String SIGNATURE_ALGORITHM = "MD5withRSA"

private static final String PUBLIC_KEY = "RSAPublicKey"

private static final String PRIVATE_KEY = "RSAPrivateKey"

/**

* 用私钥对信息生成数字签名

* @param data

*            加密数据

* @param privateKey

*            私钥

* @return

* @throws Exception

*/

public static String sign(byte[] data, String privateKey) throws Exception {

// 解密由base64编码的私钥

byte[] keyBytes = decryptBASE64(privateKey)

// 构造PKCS8EncodedKeySpec对象

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes)

// KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

// 取私钥匙对象

PrivateKey priKey = keyFactory.generatePrivate(pkcs8KeySpec)

// 用私钥对信息生成数字签名

Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM)

signature.initSign(priKey)

signature.update(data)

return encryptBASE64(signature.sign())

}

/**

* 校验数字签名

* @param data

*            加密数据

* @param publicKey

*            公钥

* @param sign

*            数字签名

* @return 校验成功返回true 失败返回false

* @throws Exception

*/

public static boolean verify(byte[] data, String publicKey, String sign)

throws Exception {

// 解密由base64编码的公钥

byte[] keyBytes = decryptBASE64(publicKey)

// 构造X509EncodedKeySpec对象

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes)

// KEY_ALGORITHM 指定的加密算法

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

// 取公钥匙对象

PublicKey pubKey = keyFactory.generatePublic(keySpec)

Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM)

signature.initVerify(pubKey)

signature.update(data)

// 验证签名是否正常

return signature.verify(decryptBASE64(sign))

}

/**

* 解密<br>

* 用私钥解密

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPrivateKey(byte[] data, String key)

throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key)

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes)

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec)

// 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm())

cipher.init(Cipher.DECRYPT_MODE, privateKey)

return cipher.doFinal(data)

}

/**

* 解密<br>

* 用公钥解密

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] decryptByPublicKey(byte[] data, String key)

throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key)

// 取得公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes)

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

Key publicKey = keyFactory.generatePublic(x509KeySpec)

// 对数据解密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm())

cipher.init(Cipher.DECRYPT_MODE, publicKey)

return cipher.doFinal(data)

}

/**

* 加密<br>

* 用公钥加密

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPublicKey(byte[] data, String key)

throws Exception {

// 对公钥解密

byte[] keyBytes = decryptBASE64(key)

// 取得公钥

X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes)

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

Key publicKey = keyFactory.generatePublic(x509KeySpec)

// 对数据加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm())

cipher.init(Cipher.ENCRYPT_MODE, publicKey)

return cipher.doFinal(data)

}

/**

* 加密<br>

* 用私钥加密

* @param data

* @param key

* @return

* @throws Exception

*/

public static byte[] encryptByPrivateKey(byte[] data, String key)

throws Exception {

// 对密钥解密

byte[] keyBytes = decryptBASE64(key)

// 取得私钥

PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes)

KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM)

Key privateKey = keyFactory.generatePrivate(pkcs8KeySpec)

// 对数据加密

Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm())

cipher.init(Cipher.ENCRYPT_MODE, privateKey)

return cipher.doFinal(data)

}

/**

* 取得私钥

* @param keyMap

* @return

* @throws Exception

*/

public static String getPrivateKey(Map<String, Object> keyMap)

throws Exception {

Key key = (Key) keyMap.get(PRIVATE_KEY)

return encryptBASE64(key.getEncoded())

}

/**

* 取得公钥

* @param keyMap

* @return

* @throws Exception

*/

public static String getPublicKey(Map<String, Object> keyMap)

throws Exception {

Key key = (Key) keyMap.get(PUBLIC_KEY)

return encryptBASE64(key.getEncoded())

}

/**

* 初始化密钥

* @return

* @throws Exception

*/

public static Map<String, Object> initKey() throws Exception {

KeyPairGenerator keyPairGen = KeyPairGenerator

.getInstance(KEY_ALGORITHM)

keyPairGen.initialize(1024)

KeyPair keyPair = keyPairGen.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

}

}

JAVA写RSA加密,私钥都是一样的,公钥每次加密的结果不一样跟对数据的padding(填充)有关。

1、Padding (填充)属性定义元素边框与元素内容之间的空间。

2、padding 简写属性在一个声明中设置所有内边距属性。设置所有当前或者指定元素内边距属性。该属性可以有1到4个值。

3、当元素的 Padding(填充)(内边距)被清除时,所"释放"的区域将会受到元素背景颜色的填充。

4、单独使用填充属性是在一个声明中设置元素的所内边距属性。缩写填充属性也可以使用,一旦改变一个数值,则padding对应的距离都会改变。

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA")

keyGen.initialize(1024)

KeyPair key = keyGen.generateKeyPair()

Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding")

//把第二个参数改为 key.getPrivate()

cipher.init(Cipher.ENCRYPT_MODE, key.getPublic())

byte[] cipherText = cipher.doFinal("Message".getBytes("UTF8"))

System.out.println(new String(cipherText, "UTF8"))

//把第二个参数改为key.getPublic()

cipher.init(Cipher.DECRYPT_MODE, key.getPrivate())

byte[] newPlainText = cipher.doFinal(cipherText)

System.out.println(new String(newPlainText, "UTF8"))

正常的用公钥加密私钥解密就是这个过程,如果按私钥加密公钥解密,只要按备注改2个参数就可以。

但是我要提醒楼主,你要公钥解密,公钥是公开的,相当于任何人都查到公钥可以解密。

你是想做签名是吧。