您的位置:首页 > 其它

对称、非对称加密算法简介

2018-02-08 10:58 204 查看
一、对称加密算法:
    使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
应用:一般应用登录 传输帐号密码使用对称加密算法,如DES(只有56位的密钥),AES(提供128位密钥)等加密。密钥可能是固定写死的。
二、非对称加密算法
    使用两把完全不同但又是完全匹配的一对钥匙—公钥和私钥。在使用不对称加密算法加密文件时,只有使用匹配的一对公钥和私钥,才能完成对明 文的加密和解密过程。加密明文时采用公钥加密,解密密文时使用私钥才能完成,而且发信方(加密者)知道收信方的公钥,只有收信方(解密者)才是唯一知道自己私钥的人。如RSA非对称加密算法。

特点:加解密速度慢

应用:
1、好点的应用系统。会使用非对称加密算法获取密钥。如下:
    非对称加密:客户端发送请求到服务器,服务器生成公钥私钥, 公钥发送给用户,用户生成密钥并使用公钥对齐加密发送到服务器段。完成密钥的交换
对称加密:后续使用密钥进行加密的数据进行业务沟通\

2、
如果提供SDK(jar包形式),SDK需要发送服务器信息,最好使用非对称加密方式,因为如果使用对称加密方式,密钥在jar包中写死,等于对外公开了该密钥

3、
更为安全的,如PC上使用SSL协议(包括密钥或许,身份认证等)来保证安全。
可参考SSL协议部分,https

RSA参考: http://blog.csdn.net/qq_18870023/article/details/52596808 http://blog.csdn.net/centralperk/article/details/8558678 http://blog.csdn.net/axi295309066/article/details/52494640 https://www.cnblogs.com/only-jlk/p/5960900.html

RSA代码参考:
public class RSATest {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub

KeyPair keyPair=genKeyPair(1024);

//获取公钥,并以base64格式打印出来
PublicKey publicKey=keyPair.getPublic();
// publicKey = getPublicKey(pub1);
System.out.println("公钥:"+new String(Base64.getEncoder().encode(publicKey.getEncoded())));

//获取私钥,并以base64格式打印出来
PrivateKey privateKey=keyPair.getPrivate();
// privateKey = getPrivateKey(pri1);
System.out.println("私钥:"+new String(Base64.getEncoder().encode(privateKey.getEncoded())));

//公钥加密
byte[] encryptedBytes=encrypt("12345".getBytes(), publicKey);
System.out.println("加密后:"+new String(encryptedBytes));

//私钥解密
byte[] decryptedBytes=decrypt(encryptedBytes, privateKey);
System.out.println("解密后:"+new String(decryptedBytes));
}

//生成密钥对
public static KeyPair genKeyPair(int keyL
4000
ength) throws Exception{
KeyPairGenerator keyPairGenerator=KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
return keyPairGenerator.generateKeyPair();
}

//公钥加密
public static byte[] encrypt(byte[] content, PublicKey publicKey) throws Exception{
Cipher cipher=Cipher.getInstance("RSA");//java默认"RSA"="RSA/ECB/PKCS1Padding"
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(content);
}

//私钥解密
public static byte[] decrypt(byte[] content, PrivateKey privateKey) throws Exception{
Cipher cipher=Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, privateKey);
return cipher.doFinal(content);
}

//将base64编码后的公钥字符串转成PublicKey实例
public static PublicKey getPublicKey(String publicKey) throws Exception{
byte[ ] keyBytes=Base64.getDecoder().decode(publicKey.getBytes());
X509EncodedKeySpec keySpec=new X509EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance("RSA");
return keyFactory.generatePublic(keySpec);
}

//将base64编码后的私钥字符串转成PrivateKey实例
public static PrivateKey getPrivateKey(String privateKey) throws Exception{
byte[ ] keyBytes=Base64.getDecoder().decode(privateKey.getBytes());
PKCS8EncodedKeySpec keySpec=new PKCS8EncodedKeySpec(keyBytes);
KeyFactory keyFactory=KeyFactory.getInstance("RSA");
return keyFactory.generatePrivate(keySpec);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: