1、对称加密算法(AES、DES、3DES)
对称加密算法是指加密和解密采用相同的密钥,是可逆的(即可解密)。
AES加密算法是密码学中的高级加密标准,采用的是对称分组密码体制,密钥长度的最少支持为128。AES加密算法是美国联邦政府采用的区块加密标准,这个标准用来替代原先的DES,已经被多方分析且广为全世界使用。
AES数学原理详解:AES加密 - block2016 - 博客园

优点:加密速度快
缺点:密钥的传递和保存是一个问题,参与加密和解密的双方使用的密钥是一样的,这样密钥就很容易泄露。
2、非对称加密算法(RSA、DSA、ECC)也叫公钥加密
非对称加密算法是指加密和解密采用不同的密钥(公钥和私钥),因此非对称加密也叫公钥加密,是可逆的(即可解密)。公钥密码体制根据其所依据的难题一般分为三类:大素数分解问题类、离散对数问题类、椭圆曲线类。

2.1、RSA加密算法(Rivest-Shamir-Adleman)
RSA是基于一个十分简单的数论事实即利用大素数分解问题的难度:将两个大素数(也就是质数:质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数,例如:17、19、23、29、31、37、41等)相乘十分容易,但是想要对其乘积进行因式分解极其困难,因此可以将乘积公开作为加密密钥。虽然RSA的安全性一直未能得到理论上的证明,但它经历了各种攻击至今未被完全攻破。
RSA公私钥生成流程
随机找两个素数P和Q,P与Q越大,越安全。(例如:61和53)
计算p和q的乘积n。(n=61×53=3233,n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。)
计算 n 的欧拉函数φ(n)。(根据公式φ(n)=(p-1)(q-1)算出φ(3233)等于60×52,即3120)
随机选择一个整数e,条件是1<e<φ(n),且e与φ(n) 互质。(条件是1<e<φ(n),且e与φ(n) 互质。1到3120之间,随机选择了17。)
有一个整数d,可以使得ed 除以φ(n) 的余数为 1。(ed ≡ 1 (mod φ(n)),即17*2753 mode 3120=1)
将n和e封装成公钥,n和d封装成私钥。(n=3233,e=17,d=2753,所以公钥就是:3233,17,私钥就是:3233, 2753。)
RSA加密
首先对明文进行比特串分组,使得每个分组对应的十进制数小于n,然后依次对每个分组m做一次加密,所有分组的密文构成的序列就是原始消息的加密结果,即m满足0<=m<n,则加密算法为:c=m^e mod n; c为密文,且0<=c<n。
欧拉函数
一.什么是欧拉函数
欧拉函数就是指:对于一个正整数n,小于或等于n的正整数中与n互质的正整数个数(包括1)的个数,记作 φ ( n )所以其通式为: φ ( n ) = n * (1 - 1/p1) * (1 - 1/p2) * …… * (1 - 1/pn),其中p1,p2……pn为n的所有质因数,例如:φ ( 10 ) 的质因数为2,5,所有φ ( 10 ) = 10 * (1 - 1/2) * (1 - 1/5) = 4(1,3,7,9这四个数)
同时φ ( 1 ) = 1;二.欧拉函数的一些性质
若n为质数,则φ ( n ) = n - 1;
若m与n互质,则φ ( n*m ) = φ ( n ) * φ ( m );
若正整数n与a互质,那么就有
若n为奇数时,φ ( 2n ) = φ ( n );
若n = pk且p是质数,那么φ ( n ) = (p - 1) * pk-1 = pk - pk-1
优点:512位(或是1024位)秘钥,计算量极大,难破解。加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。
缺点:加密速度慢
RSA加密算法既可以用来做数据加密,也可以用来数字签名。
数据加密过程:甲方用乙方的公钥加密,乙方用自己的私钥解密(甲方为发送者,乙方为接受者,乙方事先提供自己的公钥给甲方,简称:公钥加密,私钥解密)
数字签名过程:甲方用甲方的私钥加密,乙方用甲方的公钥解密(甲方为发送者,乙方为接受者,乙方解密成功说明就是甲方加的密,甲方就不可以抵赖,乙方解密需要甲方提供的公钥,简称:私钥签名,公钥验签)
详细数学原理见 【来龙去脉系列】RSA算法原理
RSA加密代码示例【Java代码】
package com.itee.common.core.adapter.utils;
import org.apache.commons.codec.binary.Base64;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.crypto.Cipher;
import java.math.BigInteger;
import java.security.*;
import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.Random;
/**
* 非对称加密算法
* RSA加密解密
**/
public class RsaUtil {
/**
* log日志
*/
private static final Logger log = LoggerFactory.getLogger(RsaUtil.class);
/**
* Rsa 公钥
*/
public static String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFChLo6awwiYODnm6OBMTdgcrh\n" +
"UD7p30xUGCVsFUyS6Ns/FMcAt51ZIVoAVoEy+qlUJSATxnecCYDICZzWU3afR2WO\n" +
"4nReYMQsg+qIiCA/bVW8r91jWZ3MBIg5V1kaW9t26yq47iY9yyg1lmrSXxGSVaiG\n" +
"wzzhFSw6TYbpMdURkwIDAQAB";
/**
* Rsa 私钥
*/
public static String PRIVATE_KEY = "MIICXgIBAAKBgQDFChLo6awwiYODnm6OBMTdgcrhUD7p30xUGCVsFUyS6Ns/FMcA\n" +
"t51ZIVoAVoEy+qlUJSATxnecCYDICZzWU3afR2WO4nReYMQsg+qIiCA/bVW8r91j\n" +
"WZ3MBIg5V1kaW9t26yq47iY9yyg1lmrSXxGSVaiGwzzhFSw6TYbpMdURkwIDAQAB\n" +
"AoGBAJsNllvapjl7vRYx8mWnsxNsM66iax+3LGVwquIm0J86xm0ZeJBD7XpaGGzz\n" +
"pa/sOJuSq29kWnNbtw+zIMw32buTrK63ksZ0gqWazKcQxXrSSe5r1vMeUtyKEvWQ\n" +
"pctAo1W/0ssV39DGe0OmiRPhO+AfjyH5MM/mqh5WjyuvCc2hAkEA6sTkFVjKHIFF\n" +
"uCsKkK81ljt8vmUD6+HGitZTbLmDsq/H1tpLpe8YlvkAeUxp349xHdH2I33IQu22\n" +
"mPG0tWhqXQJBANbbtM6mKYGCxFbJWeGyYrxLJqNkAYZJQskFZK1uYvHFLT8zKjnY\n" +
"ZoSPavQc8l1lurSswtFVD9lcxQcEL/zYDK8CQCdnlMDgfkv6hrE6yDMwtVXZ9j4e\n" +
"xmG5K5HyF16QZMKBLpGpYjkfwIjWknXJlZuof9v5ec7LNenF7HgPWb15ISECQQDO\n" +
"K58xGKMFYpzShn3YJBu4gQh/iswnto7+ZE16Wk1ZoBJN7ePcA/pDw3cm7cvnsWFa\n" +
"U9jRlCUUN3/cvrjpj8uDAkEAjR5Ts6JLvBo7Z/bIXQd1GFg0SV1iGRfnt0F+2RH/\n" +
"AlxpVtT3bhby+XJrSzIy/sOVXYblyeom0474nMjHO8oUNA==";
/**
* RSA 密钥对对象
*/
@lombok.Getter
public static class RsaKeyPair {
private final String publicKey;
private final String privateKey;
public RsaKeyPair(String publicKey, String privateKey) {
this.publicKey = publicKey;
this.privateKey = privateKey;
}
}
/**
* 构建RSA密钥对
* @return
* @throws NoSuchAlgorithmException
*/
public static RsaKeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(1024);
KeyPair keyPair = keyPairGenerator.generateKeyPair();
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();
String publicKeyString = Base64.encodeBase64String(rsaPublicKey.getEncoded());
String privateKeyString = Base64.encodeBase64String(rsaPrivateKey.getEncoded());
return new Rsa


6022

被折叠的 条评论
为什么被折叠?



