java非对称加密,rsa
1.甲方构建密钥对儿,将公钥公布给乙方,将私钥保留。
2.甲方使用私钥加密数据,然后用私钥对加密后的数据签名,发送给乙方签名以及加密后的数据;乙方使用公钥、签名来验证待解密数据是否有效,如果有效使用公钥对数据解密。
3.乙方使用公钥加密数据,向甲方发送经过加密后的数据;甲方获得加密数据,通过私钥解密。
Ps:关于数字签名会在后续的章节中介绍。可以看看这个帖子了解下http://justjavac.iteye.com/blog/1144151
一般公司这样做的。
甲乙公司各有自己的一套公钥私钥。
甲用乙公布的公钥加密,信息传递到乙,乙用自己的私钥解密。 --- 这一套是乙方的公私钥。
乙用甲公布的公钥加密,信息传递到甲,甲用自己的私钥解密。 --- 这一套是甲方的公私钥。
注:公钥长度远远小于私钥,公钥长度比较短,便于公钥保存。
package Asymmetric.encryption; import org.apache.commons.codec.binary.Hex; import javax.crypto.Cipher; import java.security.KeyPair; import java.security.KeyPairGenerator; /** * {@link http://www.cnblogs.com/allanzhang/} * @author 小卖铺的老爷爷 * */ public class RSATest { public static final String src = "laoyeye rsa"; public static void main(String[] args) throws Exception { jdkRSA(); } public static void jdkRSA() throws Exception { //初始化密钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); keyPairGenerator.initialize(512);//512~65532 KeyPair keyPair = keyPairGenerator.generateKeyPair(); //私钥加密,公钥解密 Cipher cipher = Cipher.getInstance("RSA"); cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate()); byte[] result = cipher.doFinal(src.getBytes()); System.out.println("**私钥加密,公钥解密**"); System.out.println("加密:" + Hex.encodeHexString(result)); cipher.init(Cipher.DECRYPT_MODE, keyPair.getPublic()); result = cipher.doFinal(result); System.out.println("解密:" + new String(result)); } }