-
2022-02-12 10:18:19
密码安全
摘要加密
摘要是哈希值,我们通过散列算法比如MD5算法就可以得到这个哈希值。摘要只是用于验证数据完整性和唯一性的哈希值,不管原始数据是什么样的,得到的哈希值都是固定长度的。 不管原始数据是什么样的,得到的哈希值都是固定长度的,也就是说摘要并不是原始数据加密后的密文,只是一个验证身份的令牌。所以我们无法通过摘要解密得到原始数据。
MD5信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函 数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。MD5由 美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,用以取代MD4算法。这套 算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于 需要高度安全性的数据,专家一般建议改用其他算法,如SHA-2。2004年,证实MD5算法无法防止碰撞 (collision),因此不适用于安全性认证,如SSL公开密钥认证或是数字签名等用途。 MD5存在一个缺陷,只要明文相同,那么生成的MD5码就相同,于是攻击者就可以通过撞库的方式 来破解出明文。加盐就是向明文中加入指定字符,主要用于混淆用户、并且增加MD5撞库破解难度,这样一来即使撞库破解,知道了明文,但明文也是混淆了的,真正需要用到的数据也需要从明文中摘取, 摘取范围、长度、摘取方式都是个谜,如此一来就大大增加了暴力破解的难度,使其几乎不可能破解。
摘要加密算法
- MD5算法法(MD2 、MD4、MD5)
- SHA算法(SHA1、SHA256、SHA384、 SHA512)
- HMAC算法
特点
- 任何数据加密,得到的密文长度固定。
- 密文是无法解密的(不可逆)。
验签
验签其实就是签名验证,MD5加密算法经常用于签名安全验证。疑问:要是密文也一起改了再传过去呢?
代码示例
import org.apache.commons.codec.digest.DigestUtils; public class MD5Util { /** * MD5方法 * * @param text 明文 * @return 密文 * @throws Exception */ public static String md5(String text) throws Exception { //加密后的字符串 String encode = DigestUtils.md5Hex(text); return encode; } /** * MD5方法 * * @param text 明文 * @param key 盐 * @return 密文 * @throws Exception */ public static String md5(String text, String key) throws Exception { //加密后的字符串 String encode = DigestUtils.md5Hex(text + key); return encode; } /** * MD5验证方法 * * @param text 明文 * @param key 密钥/盐 * @param md5 密文 * @return true/false * @throws Exception */ public static boolean verify(String text, String key, String md5) throws Exception { //根据传入的密钥进行验证 String md5Text = md5(text, key); return md5Text.equalsIgnoreCase(md5); } public static void main(String[] args) throws Exception { String test = "admin"; String key = "tiger"; String md5 = "bcf918bd662986b3bcab0f9a32a21e1d"; String md5Str = md5(test, key); System.out.println(md5Str); boolean passOrNot = verify(test, key, md5); System.out.println(passOrNot); } }
Base64
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印 字符来表示二进制数据的方法。
解决编码问题
代码示例
import java.util.Base64; public class Base64Util { /*** * 普通解密操作 * @param encodedText:密文 * @return */ public static byte[] decode(String encodedText) { final Base64.Decoder decoder = Base64.getDecoder(); return decoder.decode(encodedText); } /*** * 普通加密操作 * @param data * @return */ public static String encode(byte[] data) { final Base64.Encoder encoder = Base64.getEncoder(); return encoder.encodeToString(data); } /*** * 解密操作 * @param encodedText * @return */ public static byte[] decodeURL(String encodedText) { final Base64.Decoder decoder = Base64.getUrlDecoder(); return decoder.decode(encodedText); } /*** * 加密操作 * @param data * @return */ public static String encodeURL(byte[] data) { final Base64.Encoder encoder = Base64.getUrlEncoder(); return encoder.encodeToString(data); } public static void main(String[] args) throws Exception { String str = "今天的饭真好吃啊!明天还来!"; // 加密 String encode = encode(str.getBytes("UTF-8")); // 解密 byte[] decode = decode(encode); // 字节数组 -》字符串 String text = new String(decode, "UTF-8"); System.out.println("密文:" + encode); System.out.println("明文:" + text); // URL // 加密 String encodeURL = encodeURL(str.getBytes("UTF-8")); // 解密 byte[] decodeURL = decodeURL(encodeURL); // 字节数组 -》字符串 String textURL = new String(decodeURL, "UTF-8"); System.out.println("密文:" + encodeURL); System.out.println("明文:" + textURL); } }
对称加密AES
典型的对称加密算法有AES、DES、3DES,但AES加密算法的安全性要高于DES和3DES,所以AES 已经成为了主要的对称加密算法。
AES加密算法就是众多对称加密算法中的一种,它的英文全称是Advanced Encryption Standard, 翻译过来是高级加密标准,它是用来替代之前的DES加密算法的。 要理解AES的加密流程,会涉及到AES加密的五个关键词,分别是:分组密码体制、Padding、密 钥、初始向量IV和四种加密模式
代码示例
import org.bouncycastle.jce.provider.BouncyCastleProvider; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.security.Security; public class AESUtil { /** * AES加密/解密 * * @param buffer:密文/明文 * @param secretKey:秘钥 * @param mode:加密/解密模式 1 加密 2 解密 * @return */ public static byte[] encryptAndDecrypt(byte[] buffer, String secretKey, Integer mode) throws Exception { // 1、加载加密解密算法处理对象(包含算法、秘钥管理) Security.addProvider(new BouncyCastleProvider()); // 2、根据不同算法创建秘钥 1)秘钥的字节数组 2)加密算法 SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey.getBytes("UTF-8"), "AES"); // 3、设置加密模式(无论是加密还是解析,模式一致) // 1)、AES/ECB/KPS7Padding 设置算法 // 2)、指定算法库对象 Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC"); // 4、初始化加密配置 cipher.init(mode, secretKeySpec); // 5、执行加密/解密 return cipher.doFinal(buffer); } /*** * 加密解密测试 * 密钥:128(16)、192(24)、256(32) */ public static void main(String[] args) throws Exception { // 明文 String plainText = "SpringCloud Alibaba"; // 128bit 16位密钥 String secretKey = "1234567890123456"; // 将128bit 16位密钥 -》 256bit 32位密钥 secretKey = MD5Util.md5(secretKey); System.out.println("明文:" + plainText); System.out.println("密钥:" + secretKey); // 加密 byte[] bytes = encryptAndDecrypt(plainText.getBytes("UTF-8"), secretKey, 1); // 编码 String encodeStr = Base64Util.encode(bytes); System.out.println("密文:" + encodeStr); //解密 ->解码Base64->解密 byte[] decodeStr = encryptAndDecrypt(Base64Util.decode(encodeStr), secretKey, 2); System.out.println("解密后数据:" + new String(decodeStr, "UTF-8")); } }
微信支付-Native
接口文档
https://pay.weixin.qq.com/wiki/doc/api/index.html
流程说明
- 商户后台系统根据用户选购的商品生成订单。
- 用户确认支付后调用微信支付【统一下单API】生成预支付交易;
- 微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
- 商户后台系统根据返回的code_url生成二维码。
- 用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
- 微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
- 用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
- 微信支付系统根据用户授权完成支付交易。
- 微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
- 微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
- 未收到支付通知的情况,商户后台系统调用【查询订单API】。
- 商户确认订单已支付后给用户发货。
开发步骤
-
过修改官方wxpay-sdk源码,将抽象方法的修饰符从默认修改为public, 然后重新打包到本地或者私服
import com.github.wxpay.sdk.IWXPayDomain; import com.github.wxpay.sdk.WXPayConfig; import com.github.wxpay.sdk.WXPayConstants; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; @Component public class WeixinPayConfig extends WXPayConfig { //微信支付信息 @Value("${payconfig.weixin.appId}") private String appId; //应用ID @Value("${payconfig.weixin.mchID}") private String mchID; //商户号 @Value("${payconfig.weixin.key}") private String key; //秘钥 @Value("${payconfig.weixin.notifyUrl}") private String notifyUrl; //回调地址 @Value("${payconfig.weixin.certPath}") private String certPath; //证书路径 //证书字节数组 private byte[] certData; @Override public String getAppID() { return this.appId; } @Override public String getMchID() { return this.mchID; } @Override public String getKey() { return this.key; } /*** * 获取商户证书内容 * @return */ @Override public InputStream getCertStream() { /**** * 加载证书 */ if (certData == null) { synchronized (WeixinPayConfig.class) { try { if (certData == null) { File file = new File(certPath); InputStream certStream = new FileInputStream(file); this.certData = new byte[(int) file.length()]; certStream.read(this.certData); certStream.close(); } } catch (Exception e) { e.printStackTrace(); } } } ByteArrayInputStream certBis = new ByteArrayInputStream(this.certData); return certBis; } /*** * 获取WXPayDomain, 用于多域名容灾自动切换 * @return */ @Override public IWXPayDomain getWXPayDomain() { // 这个方法需要这样实现, 否则无法正常初始化WXPay IWXPayDomain iwxPayDomain = new IWXPayDomain() { @Override public void report(String domain, long elapsedTimeMillis, Exception ex) { } @Override public DomainInfo getDomain(WXPayConfig config) { return new DomainInfo(WXPayConstants.DOMAIN_API, true); } }; return iwxPayDomain; } }
-
微信支付\证书和秘钥中的证书以及秘钥配置导入到 mall-pay-service 工程中,如果是php开发,采用pem证书,如果是java开发采用p12证书
-
创建 WXPay 的实例并交给Spring容器管理
import com.github.wxpay.sdk.WXPay; import com.gupaoedu.vip.mall.pay.config.WeixinPayConfig; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; @SpringBootApplication @MapperScan(basePackages = {"com.tiger.mall.pay.mapper"}) public class MallPayApplication { public static void main(String[] args) { SpringApplication.run(MallPayApplication.class, args); } /**** * 微信支付SDK对象 * @param weixinPayConfig * @return * @throws Exception */ @Bean public WXPay wxPay(WeixinPayConfig weixinPayConfig) throws Exception { return new WXPay(weixinPayConfig); } }
微信退款
更多相关内容 -
国密加密算法自己整理的(源码文档很全)
2018-08-11 16:04:52其中包括了对称加密算法,椭圆曲线非对称加密算法,杂凑算法。具体包括SM1,SM2,SM3等,其中: SM2为国家密码管理局公布的公钥算法,其加密强度为256位。其它几个重要的商用密码算法包括: SM1,对称加密算法,加密... -
DES加密算法(c语言实现)
2019-06-11 10:50:22DES,DES加密算法,DES算法源码。用C写的DES加密算法。 DES,DES加密算法,DES算法源码。 DES加密算法(c语言实现) (本程序可以直接使用) -
AES-128加密算法,C语言实现
2019-04-25 15:24:42该文件是AES加密算法C语言的实现,在STM32平台验证通过,ECB加密方式,方便移植。 -
RSA加密算法源码
2016-02-23 09:31:15RSA加密算法源码 详情参见:http://blog.csdn.net/lemon_tree12138/article/details/50696926 -
C#国密加密算法SM2,SM3,SM4
2018-07-09 13:03:13C#国密加密算法SM2,SM3,SM4的一个实现案例,不涉及具体的算法剖析,在网络上关于这个加密算法的文档较少,切在跨语言加密解密上会存在一些问题,所以整理。 -
DES加密算法—实现(C语言)
2016-09-22 09:55:48用vs2012写的,可以直接运行想要代码的话,都在一个cpp文件中 -
RSA加密算法(c语言)
2015-06-03 00:29:47个人编的RSA加密程序,要想了解具体算法说明或者其他加密算法请关注我的博客----适合任何对算法理解不透彻的密码初学者和爱好者。 -
图像加密算法与实践
2015-06-13 16:01:47该文件包括了《图像加密与实践—基于C#语言实现》一书中的所有原代码,是全面学习混沌加密,等加密算法的最佳力作 -
对称加密与非对称加密算法
2022-01-24 16:25:551.2、对称加密算法 1.2.1、DES 1.2.2、3DES 1.2.4、AES 1.2.5、SM1 1.2.6、SM4 1.2.7、RC2 1.2.8、RC4 1.2.9、RC5 说明 2、非对称加密 2.1、非对称加密算法 2.1.1、RSA 2.1.2、ECC 2.1.3、SM2 3、...目录
1、对称加密
加密和解密使用同一个密钥。
1.1、加密类型
对称加密算法有两种加密类型:流加密和块加密。1.1.1、流加密
流加密:流加密法是一次加密明文中的一位,解密也是一位一位去解密。
1.1.2、块加密
块加密(也称为分组加密):块加密法是一次加密明文中的一块,解密也是一块一块去解密。
假设加密的明文是WELCOMETOCHINA,先加密WELCOME,再加密TO,再加密CHINA,即一次加密明文中的一个块。
算法模式是块加密法中一系列基本算法步骤的组合。块加密法常用的加密模式:电子编码簿模式(ECB),加密块链接模式(CBC),加密反馈模式(CFB),输出反馈模式(OFB),计数器模式(CTR)。
电子编码簿模式(ECB)
电子编码簿模式是最简单的操作模式,将输入明文消息分为64位块,然后单独加密每个块,消息中所有块使用相同密钥加密。
加密步骤如下:
从加密步骤我们可以看出,ECB模式中用同一个密钥加密消息的所有块,如果原消息中重复明文块,则加密消息中的相应密文块也会重复。如果输入中一个明文块多次出现,则输出中相应的密文块也会多次出现,从而让攻击者找到漏洞进行破解。
加密块链接模式(CBC)
为了解决ECB模式中相同明文产生相同密文的问题,出现了CBC加密模式。CBC加密模式保证了即使输入中明文块相同,也能得到不同的密文块。CBC加密模式使用了反馈机制。
加密步骤如下:
第一步接收两个输入:明文块1和一个随机文本块IV(Initialization Vector),称为初始化向量。
初始向量没有什么特别意义,只是使每个消息唯一。初始化向量是随机生成的,可以保证明文块1即使相同也能产生不同密文块1(随机生成的初始化向量相同的概率是很小的)。
加密时第一步使用IV和明文1作异或运算,加密后得到密文1,第二步用密文1和明文2作异或运算,加密后得到密文2,后面依此类推。
初始化向量只在第一个明文块中使用,但所有明文块加密依旧使用相同密钥。
加密反馈模式(CFB)
不是所有应用程序都能处理数据块,面向字符的应用程序也需要安全性。这时要使用流加密法,可以使用加密反馈模式。
加密反馈模式中,数据用更小的单元加密(可以是8位,即一个字符的长度),这个长度小于定义的块长(通常是64位)。假设我们一次处理j位(j通常取8)。
第一步:
与CBC模式一样,加密反馈模式也使用64位的初始化向量。初始化向量放在移位寄存器中,第一步产生相应的64位初始化向量密文
第二步:
加密初始化向量最左边的j位与明文前j位进行异或运算,产生密文第一部分密文C。
第三步:
初始化向量的位左移j位,使移位寄存器最右边的j位为不可预测的数据,在其中填入C的内容。
第四步:
重复1~3步,直到加密所有明文单元
总体加密过程如下
输出反馈模式(OFB)
输出反馈模式与CFB很相似,唯一差别是,CFB中密文填入加密过程下一阶段,而在OFB中,IV加密过程的输入填入加密过程下一阶段。
计数器模式(CTR)
计数器模式与OFB模式非常类似。它使用序号(称为计数器)作为算法的输入。每个块加密后,要填充到寄存器中,使用下一个寄存器值。通常使用一个常数作为初始计数器的值,并且每次迭代后递增(通常是增加1)。计数器块的大虚哎等于明文块的大小。
加密时,计数器加密后与明文块作XOR运算,得到密文。
1.2、对称加密算法
1.2.1、DES
全称为Data Encryption Standard,即数据加密标准。
DES是一种块加密算法,按64位块长加密数据,即把64位明文作为DES的输入,产生64位密文输出。
DES工作原理
DES使用56位密钥。实际上,最初的密钥为64位,但在DES过程开始之前放弃密钥的每个第八位,从而得到56位密钥,即放弃第8、16、24、32、40、48、56、64位。
1.2.2、3DES
即三重DES,就是三次执行DES,分为两个大类
三个密钥的三重DES
首先用密钥K1加密明文块P,然后用密钥K2加密,最后用密钥K3加密,其中K1,K2,K3各不相同
两个密钥的三重DES
1.2.4、AES
全称为Advanced Encryption Standard,即高级加密标准,这个标准用来替代原先的DES。1998年6月,Rijndael算法提交给美国国家标准与技术协会(NIST),作为AES的候选算法之一。最初有15种候选算法。2000年10月,NIST宣布AES最终选择Rijndael。
Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256位为上限。AES只选择了区块长度固定为128位,密钥长度为128,192或256位。
2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。
1.2.5、SM1
SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。1.2.6、SM4
SM4由我国国家密码管理局在2012年发布,常用于无线互联网加密等领域。与DES和AES算法类似,SM4算法也是一种分组加密算法。其分组长度为128位,密钥长度也为128位。1.2.7、RC2
RC2是一种块加密算法。输入和输出块大小都是64位。而密钥是可变的,从1字节到128字节。1.2.8、RC4
RC4是一种流加密算法。1.2.9、RC5
RC5是一种块加密算法。块长、轮数、密钥长度都是可变的。块长可取16,32和64位。密钥长度为0~2040位。RC5算法的特定实例记作R5-w/r/b,其中w为分组长度,r为轮数,b为密钥长度。
RC5-32/16/16 表示RC5的块长为64位(RC5一次加密2字节),16轮和16字节(128位)密钥。
说明
上面介绍的几种对称加密算法,只有RC4是流加密,其他都是分组加密。上面这些只是对对称加密算法进行了一个简单介绍,没有介绍这些算法的加密步骤,如果你对这些加密算法的步骤感兴趣,推荐两本书籍,可以自行去查阅:
《密码编码学与网络安全》 -[美] William Stallings 著 电子工业出版社
《密码学与网络安全》-Atul Kahate著 清华大学出版社
后面如果有时间和精力,我会单独写文章介绍这些加密算法的加密步骤。
2、非对称加密
非对称加密又称为公钥加密,使用一对密钥,一把为私钥,是保密的,一把为公钥,可以对外公布。使用公钥对明文进行加密,使用私钥对密文进行解密。公钥密码学的发展是整个密码学发展历史中最伟大的一次革命。在公钥加密算法发明之前,加密算法都是基于替换和置换这些初等方法之上。而公钥密码学算法则是基于数学函数。
2.1、非对称加密算法
2.1.1、RSA
RSA是被研究得最广泛的公钥算法,从提出到现在,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。
RSA算法生成密钥对以及加解密过程:
(1) 选择两个大素数P,Q
设P = 7,Q = 17
(2) 计算N = P x Q
N = 7 x 17 = 119
(3) 选择一个公钥E,使其不是(P - 1)与(Q - 1)的因子
(P - 1) = 6 = 2 x 3
(Q - 1) = 16 = 2 x 2 x 2 x 2
因此我们选的公钥E不能有因子2和3。我们取E = 5
(4) 选择私钥D,满足:(D x E) mod (P - 1) x (Q - 1) = 1
(D x 5) mod 6 x 16 = 1
(D x 5) mod 96 = 1
经计算,取D = 77
(5) 加密时,从明文PT计算密文CT:CT = mod N
假设明文为10
CT = mod 119 = 40
(6) 将密文CT发送给接收方
将40发送给接收方
(7) 解密时,从密文CT得到明文PT:PT = mod N
PT = mod 119 = 10
从上述例子可以看出,RSA算法本身很简单,关键是选择正确的密钥。
假设B要接收A的加密消息,首先生成公钥E和私钥D,私钥D自己保留,公钥E和数字N发布出去,攻击者拿到公钥E和数字N,似乎可以通过试错法计算出私钥D。这里就到了问题的关键,从上述例子可以看出,攻击者只要从N中分解出P和Q,就可以破解私钥。我们上述例子中选择的N很小,实际N是很大的,而大素数分解是极其困难的。
2.1.2、ECC
大多数使用公钥密码学进行加密和数字签名的产品和标准都使用RSA算法。我们知道,为了保证RSA使用的安全性,最近这些年来密钥的位数一直在增加,这对使用RSA的应用是很重的负担,对进行大量安全交易的电子商务更是如此(从上面RSA加解密的例子可以推测,当要使用1024位密钥时,计算量是很大的)。与RSA相比,ECC可以使用比RSA短得多得密钥得到相同得安全性,因此可以减少处理负荷。另一方面,虽然关于ECC的理论已经很成熟,但ECC的可信度还没有RSA高。
ECC全称为elliptic curve cryptography,即椭圆曲线密码学算法。安全性建立在以下数学困难问题基础之上:
椭圆曲线上的离散对数问题:
已知有限域Fp 椭圆曲线点群Ep (a,b) 及其生成元点P∈Ep (a,b),P的阶是一个大素数。已知整数
k∈Fp 和点P,求点Q=kP是容易的,但已知点P和Q求整数k则是困难的。
椭圆曲线上的两个点P和Q,k为整数,Q = kP,椭圆曲线加密的数学原理:点P称为基点,k为私钥,Q为公钥。
给定k和P,计算Q很容易。但给定P和Q,求k非常困难。
椭圆曲线方程:y =
+ a
+ b
加解密过程:
(1) 用户选定一条椭圆曲线Ep(a, b), 并取椭圆曲线上一点作为基点P
(2) 用户A选择大数k作为私钥,并生成公钥Q = kP
(3) 用户A将Ep(a, b),公钥Q和基点P传给B用户
(4) 用户B接受到信息后,将待传输的明文编码到Ep(a,b)上的一点M,并产生一个随机整数r。
(5) 用户B计算点C1 = M + rQ,C2 = rP
(6) 用户B将C1和C2传给A
(7) 用户A接收到信息后,计算C1 - kC2,就可以得到点M(C1 - kC2 = M + rQ - krP = M + r(Q - kP) = M)。
(8) 再对M进行解码就可以得到明文。
假设在加密过程中,有一个第三者H,H只能知道椭圆曲线 Ep(a,b)、公钥Q、基点P、密文点C(C1, C2),而通过公钥Q、基点P求私钥k或者通过密文点C(C1, C2)、基点P求随机数r都是非常困难的,因此得以保证数据传输的安全。
密码学中,描述一条Fp上的椭圆曲线,常用到六个参量:T=(p,a,b,n,x,y)。(p 、a 、b) 用来确定一条椭圆曲线,p为素数域内点的个数,a和b是其内的两个大数;x,y为G基点的坐标,也是两个大数;n为点G基点的阶;以上六个量就可以描述一条椭圆曲线。
2.1.3、SM2
SM2算法是我国自主知识产权的商业密码算法,是ECC的一种。ECC是基于椭圆曲线方程 y =
+ a
+ b,SM通过指定系数a,b确定了唯一的一条曲线。简单理解就是ECC选取的椭圆曲线可以有无数个,而SM2只是选取了唯一的一条椭圆曲线。
SM2椭圆曲线公钥密码算法推荐曲线参数
推荐使用素数域256位椭圆曲线。
椭圆曲线方程:y =
+ a
+ b
曲线参数:
p=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFF
a=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF 00000000 FFFFFFFF FFFFFFFC
b=28E9FA9E 9D9F5E34 4D5A9E4B CF6509A7 F39789F5 15AB8F92 DDBCBD41 4D940E93
n=FFFFFFFE FFFFFFFF FFFFFFFF FFFFFFFF 7203DF6B 21C6052B 53BBF409 39D54123
Gx=32C4AE2C 1F198119 5F990446 6A39C994 8FE30BBF F2660BE1 715A4589 334C74C7
Gy=BC3736A2 F4F6779C 59BDCEE3 6B692153 D0A9877C C62A4740 02DF32E5 2139F0A0
国家密码管理局已经发布了《SM2椭圆曲线公钥密码算法》公告,对SM2算法有非常详细的说明,感兴趣的读者可以自行去查阅。
国家密码管理局关于发布《SM2椭圆曲线公钥密码算法》公告(国密局公告第21号)_国家密码管理局 (oscca.gov.cn)https://oscca.gov.cn/sca/xxgk/2010-12/17/content_1002386.shtml
3、对称加密与非对称加密技术比较
对称加密优点:加密速度快
缺点:密钥管理分配困难,安全性较低
非对称加密
优点:安全性较高
缺点:加密速度慢
对称加密技术加密和解密使用的都是同一个密钥,因此密钥的管理非常困难,在分发密钥的过程中,如果密钥被截获,那后面的通信就是不安全的。而非对称加密技术就很好的解决了这一问题,非对称加密技术使用公钥加密,私钥加密。通信前把公钥发布出去,私钥只有自己保留,即便你的公钥被攻击者拿到,没有私钥,就无法进行解密。
那有了非对称加密技术,对称加密是不是就被淘汰了?当然不是,因为非对称加密技术加解密比较慢,不适合对大量数据的加解密。
实际中对称加密和非对称加密是结合使用的。一般我们用对称密钥对明文进行加密,然后用非对称算法的公钥对对称密钥进行加密(加密后的东西称为数字信封),然后将数字信封和密文一起发送出去,接收者收到信息后,先用非对称算法的私钥对数字信封进行解密,得到对称密钥,再用对称密钥解密密文,就拿到了原文信息。
这就是数字信封的原理,具体原理参考我写的另一篇文章《浅谈数字信封》。
4、实践
接下来我们就实际操作一下,先介绍一下开源库openssl。
OpenSSL 是一个开源且功能强大的包含丰富的密码算法和 SSL/TLS 协议的库,主要包括的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供了多用途的命令行工具。使用 c 语言编写,跨平台性能好,支持 Linux、Windows、BDS、Mac、VMS 等平台。
Openssl由3部分组成
- The Crypto library(密码学算法库)
- The SSL library(SSL/TLS协议库)
- Command line tool(命令行工具)
ubuntu下安装命令:
sudo apt-get install openssl
sudo apt-get install libssl-dev
安装后就可以直接使用openssl命令行工具。
4.1、对称加密工具enc是openssl提供的一个对称加解密命令行工具。安装openssl后,执行命令openssl enc -list,可以看到enc支持的所有对称加密算法
lng@ubuntu:~$ openssl enc -list Supported ciphers: -aes-128-cbc -aes-128-cfb -aes-128-cfb1 -aes-128-cfb8 -aes-128-ctr -aes-128-ecb -aes-128-ofb -aes-192-cbc -aes-192-cfb -aes-192-cfb1 -aes-192-cfb8 -aes-192-ctr -aes-192-ecb -aes-192-ofb -aes-256-cbc -aes-256-cfb -aes-256-cfb1 -aes-256-cfb8 -aes-256-ctr -aes-256-ecb -aes-256-ofb -aes128 -aes128-wrap -aes192 -aes192-wrap -aes256 -aes256-wrap -aria-128-cbc -aria-128-cfb -aria-128-cfb1 -aria-128-cfb8 -aria-128-ctr -aria-128-ecb -aria-128-ofb -aria-192-cbc -aria-192-cfb -aria-192-cfb1 -aria-192-cfb8 -aria-192-ctr -aria-192-ecb -aria-192-ofb -aria-256-cbc -aria-256-cfb -aria-256-cfb1 -aria-256-cfb8 -aria-256-ctr -aria-256-ecb -aria-256-ofb -aria128 -aria192 -aria256 -bf -bf-cbc -bf-cfb -bf-ecb -bf-ofb -blowfish -camellia-128-cbc -camellia-128-cfb -camellia-128-cfb1 -camellia-128-cfb8 -camellia-128-ctr -camellia-128-ecb -camellia-128-ofb -camellia-192-cbc -camellia-192-cfb -camellia-192-cfb1 -camellia-192-cfb8 -camellia-192-ctr -camellia-192-ecb -camellia-192-ofb -camellia-256-cbc -camellia-256-cfb -camellia-256-cfb1 -camellia-256-cfb8 -camellia-256-ctr -camellia-256-ecb -camellia-256-ofb -camellia128 -camellia192 -camellia256 -cast -cast-cbc -cast5-cbc -cast5-cfb -cast5-ecb -cast5-ofb -chacha20 -des -des-cbc -des-cfb -des-cfb1 -des-cfb8 -des-ecb -des-ede -des-ede-cbc -des-ede-cfb -des-ede-ecb -des-ede-ofb -des-ede3 -des-ede3-cbc -des-ede3-cfb -des-ede3-cfb1 -des-ede3-cfb8 -des-ede3-ecb -des-ede3-ofb -des-ofb -des3 -des3-wrap -desx -desx-cbc -id-aes128-wrap -id-aes128-wrap-pad -id-aes192-wrap -id-aes192-wrap-pad -id-aes256-wrap -id-aes256-wrap-pad -id-smime-alg-CMS3DESwrap -rc2 -rc2-128 -rc2-40 -rc2-40-cbc -rc2-64 -rc2-64-cbc -rc2-cbc -rc2-cfb -rc2-ecb -rc2-ofb -rc4 -rc4-40 -seed -seed-cbc -seed-cfb -seed-ecb -seed-ofb -sm4 -sm4-cbc -sm4-cfb -sm4-ctr -sm4-ecb -sm4-ofb
enc完整命令
openssl enc -ciphername [-in filename] [-out filename] [-pass arg] [-e ] [-d ] [-a ] [-A] [-k password ] [-kfile filename] [-K key] [-iv IV] [-p] [-P] [-bufsize number] [-nopad] [-debug]
-ciphername:对称算法名称(就是上面执行openssl enc -list命令后展示的那些)
-in filename:输入文件,默认为标准输入。
-out filename:输出文件,默认为标准输出。
-pass arg:输入文件如果有密码保护,指定密码来源。
-e:进行加密操作,默认操作。
-d:进行解密操作。
-a:当进行加解密时,它只对数据进行运算,有时需要进行base64转换。设置此选项后,加密结果进行base64编码;解密前先进行base64解码。
-A:默认情况下,base64编码结果在文件中是多行的。如果要将生成的结果在文件中只有一行,需设置此选项;解密时,必须采用同样的设置,否则读取数据时会出错。
-k password:指定加密口令,不设置此项时,程序会提示用户输入口令。
-kfile filename:指定口令存放的文件。
-K key:密钥,为16进制。
-iv IV:初始化向量,为16进制。
-p:打印出使用的salt、口令以及初始化向量IV。
-P:打印使用的salt、口令以及IV,不做加密和解密操作。
-bufsize number:设置I/O操作的缓冲区大小,因为一个文件可能很大,每次读取的数据是有限的。
-debug:打印调试信息。
4.1.1、AES加解密
加密命令
openssl enc -aes-128-cbc -in in.txt -out out.txt -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF
我们选择的密钥长度为128位,从上面列表可以知道,密钥长度可以选取128位,192位,256位。选择的加密模式为cbc,加密模式可以选取ecb,cbc,cfb,ofb,ctr。加密模式是什么意思在上面已经将的很清楚了。
演示
lng@ubuntu:~/CSDN/enc$ cat in.txt hello word lng@ubuntu:~/CSDN/enc$ openssl enc -aes-128-cbc -in in.txt -out out.txt -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF lng@ubuntu:~/CSDN/enc$ ls in.txt out.txt lng@ubuntu:~/CSDN/enc$ cat out.txt Bqbu9rk0uOXRgahyZWW7tA== lng@ubuntu:~/CSDN/enc$
解密命令
openssl enc -aes-128-cbc -in out.txt -out inin.txt -d -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF
演示
lng@ubuntu:~/CSDN/enc$ openssl enc -aes-128-cbc -in out.txt -out inin.txt -d -a -K 001122334455BBCCDDEEFF0011223344 -iv 0123456789ABCDEF0123456789ABCDEF lng@ubuntu:~/CSDN/enc$ ls inin.txt in.txt out.txt lng@ubuntu:~/CSDN/enc$ cat inin.txt hello word lng@ubuntu:~/CSDN/enc$
注意:如果你要阅读密文,要指定参数-a进行base64编码,否则密文是二进制文件,解密时也要指定-a参数,先进行base64解码,再进行解密。
默认是加密操作,加密时可以不指定参数,但解密时我们要指定参数-d
ecb模式是没有初始化向量的,所以ecb模式我们不用指定-iv参数
你可以选择不同的密钥长度和不同的加密模式,看看密文有什么不同。我这里就不演示了
4.1.2、DES加解密
des密钥长度是固定的,为64位,所以我们只需要选择加密模式。
lng@ubuntu:~/CSDN/enc$ cat in.txt hello word lng@ubuntu:~/CSDN/enc$ openssl enc -des-ecb -K 0123456789AAAAAA -in in.txt -out out.txt -a lng@ubuntu:~/CSDN/enc$ ls in.txt out.txt lng@ubuntu:~/CSDN/enc$ cat out.txt munBF17bqEeZ28tiddZVxg== lng@ubuntu:~/CSDN/enc$ openssl enc -des-ecb -d -K 0123456789AAAAAA -in out.txt -out inin.txt -a lng@ubuntu:~/CSDN/enc$ ls inin.txt in.txt out.txt lng@ubuntu:~/CSDN/enc$ cat inin.txt hello word lng@ubuntu:~/CSDN/enc$
4.2、非对称加密工具
4.2.1、RSA加密
这里介绍下openssl命令行工具的两个命令
genrsa 生成rsa密钥
rsa 用于处理rsa密钥,格式转换和打印信息
生成私钥
# private.key 为私钥文件,其中包含公钥和私钥,1024为密钥长度 openssl genrsa -out private.key 1024
导出公钥
# 从私钥文件中导出公钥 openssl rsa -in private.key -pubout -out public.key
使用公钥加密
openssl rsautl -encrypt -pubin -inkey public.key -in in.txt -out out.txt
使用私钥解密
openssl rsautl -decrypt -inkey private.key -in out.txt -out inin.txt
4.2.2、ECC加密
ecparam 椭圆曲线密钥参数生成及操作
ec 椭圆曲线密钥处理工具
查看支持的椭圆曲线
openssl ecparam -list_curves
可以看到支持的所有椭圆曲线,最前面的就是曲线名称。
secp112r1 : SECG/WTLS curve over a 112 bit prime field secp112r2 : SECG curve over a 112 bit prime field secp128r1 : SECG curve over a 128 bit prime field secp128r2 : SECG curve over a 128 bit prime field secp160k1 : SECG curve over a 160 bit prime field secp160r1 : SECG curve over a 160 bit prime field secp160r2 : SECG/WTLS curve over a 160 bit prime field secp192k1 : SECG curve over a 192 bit prime field secp224k1 : SECG curve over a 224 bit prime field secp224r1 : NIST/SECG curve over a 224 bit prime field secp256k1 : SECG curve over a 256 bit prime field secp384r1 : NIST/SECG curve over a 384 bit prime field secp521r1 : NIST/SECG curve over a 521 bit prime field prime192v1: NIST/X9.62/SECG curve over a 192 bit prime field prime192v2: X9.62 curve over a 192 bit prime field prime192v3: X9.62 curve over a 192 bit prime field prime239v1: X9.62 curve over a 239 bit prime field prime239v2: X9.62 curve over a 239 bit prime field prime239v3: X9.62 curve over a 239 bit prime field prime256v1: X9.62/SECG curve over a 256 bit prime field sect113r1 : SECG curve over a 113 bit binary field sect113r2 : SECG curve over a 113 bit binary field sect131r1 : SECG/WTLS curve over a 131 bit binary field sect131r2 : SECG curve over a 131 bit binary field sect163k1 : NIST/SECG/WTLS curve over a 163 bit binary field sect163r1 : SECG curve over a 163 bit binary field sect163r2 : NIST/SECG curve over a 163 bit binary field sect193r1 : SECG curve over a 193 bit binary field sect193r2 : SECG curve over a 193 bit binary field sect233k1 : NIST/SECG/WTLS curve over a 233 bit binary field sect233r1 : NIST/SECG/WTLS curve over a 233 bit binary field sect239k1 : SECG curve over a 239 bit binary field sect283k1 : NIST/SECG curve over a 283 bit binary field sect283r1 : NIST/SECG curve over a 283 bit binary field sect409k1 : NIST/SECG curve over a 409 bit binary field sect409r1 : NIST/SECG curve over a 409 bit binary field sect571k1 : NIST/SECG curve over a 571 bit binary field sect571r1 : NIST/SECG curve over a 571 bit binary field c2pnb163v1: X9.62 curve over a 163 bit binary field c2pnb163v2: X9.62 curve over a 163 bit binary field c2pnb163v3: X9.62 curve over a 163 bit binary field c2pnb176v1: X9.62 curve over a 176 bit binary field c2tnb191v1: X9.62 curve over a 191 bit binary field c2tnb191v2: X9.62 curve over a 191 bit binary field c2tnb191v3: X9.62 curve over a 191 bit binary field c2pnb208w1: X9.62 curve over a 208 bit binary field c2tnb239v1: X9.62 curve over a 239 bit binary field c2tnb239v2: X9.62 curve over a 239 bit binary field c2tnb239v3: X9.62 curve over a 239 bit binary field c2pnb272w1: X9.62 curve over a 272 bit binary field c2pnb304w1: X9.62 curve over a 304 bit binary field c2tnb359v1: X9.62 curve over a 359 bit binary field c2pnb368w1: X9.62 curve over a 368 bit binary field c2tnb431r1: X9.62 curve over a 431 bit binary field wap-wsg-idm-ecid-wtls1: WTLS curve over a 113 bit binary field wap-wsg-idm-ecid-wtls3: NIST/SECG/WTLS curve over a 163 bit binary field wap-wsg-idm-ecid-wtls4: SECG curve over a 113 bit binary field wap-wsg-idm-ecid-wtls5: X9.62 curve over a 163 bit binary field wap-wsg-idm-ecid-wtls6: SECG/WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls7: SECG/WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls8: WTLS curve over a 112 bit prime field wap-wsg-idm-ecid-wtls9: WTLS curve over a 160 bit prime field wap-wsg-idm-ecid-wtls10: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls11: NIST/SECG/WTLS curve over a 233 bit binary field wap-wsg-idm-ecid-wtls12: WTLS curve over a 224 bit prime field Oakley-EC2N-3: IPSec/IKE/Oakley curve #3 over a 155 bit binary field. Not suitable for ECDSA. Questionable extension field! Oakley-EC2N-4: IPSec/IKE/Oakley curve #4 over a 185 bit binary field. Not suitable for ECDSA. Questionable extension field! brainpoolP160r1: RFC 5639 curve over a 160 bit prime field brainpoolP160t1: RFC 5639 curve over a 160 bit prime field brainpoolP192r1: RFC 5639 curve over a 192 bit prime field brainpoolP192t1: RFC 5639 curve over a 192 bit prime field brainpoolP224r1: RFC 5639 curve over a 224 bit prime field brainpoolP224t1: RFC 5639 curve over a 224 bit prime field brainpoolP256r1: RFC 5639 curve over a 256 bit prime field brainpoolP256t1: RFC 5639 curve over a 256 bit prime field brainpoolP320r1: RFC 5639 curve over a 320 bit prime field brainpoolP320t1: RFC 5639 curve over a 320 bit prime field brainpoolP384r1: RFC 5639 curve over a 384 bit prime field brainpoolP384t1: RFC 5639 curve over a 384 bit prime field brainpoolP512r1: RFC 5639 curve over a 512 bit prime field brainpoolP512t1: RFC 5639 curve over a 512 bit prime field SM2 : SM2 curve over a 256 bit prime field
生成参数文件
选择一条曲线生成参数文件
openssl ecparam -name secp256k1 -out secp256k1.pem
显示参数文件参数
openssl ecparam -in secp256k1.pem -text -param_enc explicit -noout
使用参数文件生成私钥
openssl ecparam -in secp256k1.pem -genkey -out secp256k1-key.key
从私钥中导出公钥
openssl ec -in secp256k1-key.key -pubout -out public.key
参考资料
《密码编码学与网络安全》 -[美] William Stallings 著 电子工业出版社
《密码学与网络安全》-Atul Kahate著 清华大学出版社
-
js实现rsa加密算法
2014-09-21 00:53:55本rsa算法是使用Java与javascript加密解密范例代码,该资料从互联网收集,加上了自己的使用体会,如果对你有帮助那是万幸! js加密部分 -
AES加密算法(java)实现
2015-01-15 16:32:382006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。本软件是用java语言开发,实现了AES算法对文件的加密和解密,并在界面上加了进度条,来提示用户加密解密的进度。如果不足之处,欢迎留言。 -
java RSA公钥加密算法完整源代码
2014-09-02 11:37:05RSA是目前最有影响力的公钥加密算法,现公布Java版完整源代码,经本人测试、运行没有问题。 -
MAC加密算法(银联标准)
2014-10-09 14:44:35将异或运算后的最后8个字节(RESULT BLOCK)转换成16个HEXDECIMAL,取前8个字节用mkey1,DES加密,将加密后的结果与后8 个字节异或,用异或的结果TEMP BLOCK 再进行一次单倍长密钥算法运算,将运算后的结果(ENC BLOCK2... -
加密算法及应用总结
2020-09-01 13:03:22加密算法 使用密码学可以达到以下目的: 保密性:防止用户的标识或数据被读取。 数据完整性:防止数据被更改。 身份验证:确保数据发自特定的一方。 在加密中,应该保密的仅仅是明文和密钥。也就是说我们通常假设...加密算法
使用加密算法可以达到以下目的:
- 保密性:防止用户的标识或数据被读取。
- 数据完整性:防止数据被更改。
- 身份验证:确保数据发自特定的一方。
在如今的信息安全领域,有各种各样的加密算法凝聚了数学家们的智慧。从宏观上来看,这些加密算法可以归结为三大类:哈希算法、对称加密算法、非对称加密算法。
在加密中,应该保密的仅仅是明文和密钥。也就是说我们通常假设攻击者对加密算法和密文了如指掌,因此加密的安全性应该仅仅依赖于密钥而不是依赖于假设攻击者不知道加密算法。
1. 哈希算法
哈希算法:又称散列算法,把任意长度的输入通过哈希算法转换成固定长度的输出,这个固定长度的输出称为原输入消息的"哈希值"或"散列值"或"消息摘要"。
由于哈希算法的定义域是一个无限集合,而值域是一个有限集合,将无限集合映射到有限集合,每个哈希结果都存在无数个可能的目标文本,因此哈希不是一一映射,是不可逆的。
而加密算法是一一映射,因此理论上来说是可逆的。所以严格意义上哈希算法也不算加密,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。
一个优秀的 hash 算法,将能实现:
-
正向快速:给出明文和哈希算法,能在有限时间和有限资源内,将任意长度的明文快速计算出哈希值。
-
逆向困难:给定若干哈希值,在现有计算条件下,有限时间内几乎无法逆推出明文。
-
雪崩效应:哪怕原始输入信息修改一丁点儿,产生的哈希值也有很大的不同。所以,数据是否被篡改过,是否完整,都可以通过它的哈希值进行检验。
-
长度一致:长度不一样的信息散列计算后,长度是一致的。
-
冲突避免:不同的明文,通过散列计算后不会得到相同的哈希值,避免发生哈希冲突。
对简单哈希(Hash)的攻击
对于哈希的攻击,主要有寻找碰撞法和穷举法。
先来说说寻找碰撞法。数据库通常会使用md5或sha-1对用户密码加密存储,从哈希本身的定义可以看出,如果想非法登录,不一定非要得到注册时的密码,只要能得到一个密码的哈希碰撞即可。因此,如果能从哈希值中分析出一个密码的碰撞,则大功告成。
不过对这种攻击大可不必担心,因为目前对于MD5和SHA-1并不存在有效地寻找碰撞方法。虽然我国的数学家王小云教授曾经在国际密码学会议上发布了对于MD5和SHA-1的碰撞寻找改进算法,但这种方法和很多人口中所说的“破解”相去甚远,其理论目前仅具有数学上的意义,她将破解MD5的预期步骤数从280降到了269,虽然从数学上降低了好几个数量级,但2^69对于实际应用来说仍然是一个天文数字,就好比以前需要一亿年,现在需要一万年一样。
不过这并不意味着使用MD5或SHA-1后就万事大吉了,因为还有一种对于哈希的攻击方法——穷举法。通俗来说,就是在一个范围内,如从000000到999999,将其中所有值一个一个用相同的哈希算法计算,然后将结果和目标哈希值比较,如果相同,则这个值就一定是源字串或源字串的一个碰撞,于是就可以用这个值非法登录了。
这种看似笨拙的方法,在现实中爆发的能量却是惊人的,目前几乎所有的MD5破解机或MD5在线破解都是用这种穷举法,但就是这种“笨”方法,却成功破解出很多哈希串。纠其缘由,就是相当一部分口令是非常简单的,如“123456”或“000000”这种口令还有很多人在用,可以看出,穷举法是否能成功很大程度上取决于口令的复杂性。因为穷举法扫描的区间往往是单字符集、规则的区间,或者由字典数据进行组合,因此,如果使用复杂的口令,例如“ASDF#$%op.8930”这种变态级口令,穷举法就很难奏效了。
常见的哈希算法:MD5、SHA1、HMAC
MD5
MD5 的全称是
Message-Digest Algorithm 5
(信息-摘要算法),哈希值固定为128 bit长度。1996年后被证实存在弱点,可以被加以破解,对于需要高度安全性的资料,专家一般建议改用其他算法,如SHA-2。
SHA1
SHA1 的全称是
Secure Hash Algorithm
(安全哈希算法) ,SHA1 基于 MD5,加密后的数据长度更长,它对长度小于 2 ^ 64 bit的输入,产生长度为 160bit 的散列值。但SHA-1的安全性在2010年以后已经不被大多数的加密场景所接受。2017年荷兰密码学研究小组CWI和Google正式宣布攻破了SHA-1。建议使用更强大的SHA-2哈希算法。
SHA-2
2001年发布,包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256。SHA-2目前没有出现明显的弱点,至今尚未出现对SHA-2有效的攻击。
HMAC
HMAC:全称是
Hash-based Message Authentication Code
(哈希运算消息认证码),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。也就是说HMAC是需要一个密钥的。HMAC 发送方 和 接收方 都有的 key 进行计算,而没有这把 key 的第三方,则是 无法计算 出正确的 散列值的,这样就可以 防止数据被篡改。
Base64
Base64是一种将二进制流表示为 64 个字符的编码方式。
Base64并不是一种加密方式,明文使用Base64编码后的字符串通过索引表可以直接还原为明文。因此,Base64只能算是一个编码算法,对数据内容进行编码来适合传输。
2. 对称加密算法
对称加密算法是当今应用范围最广,使用频率最高的加密算法。它不仅应用于软件行业,在硬件行业同样流行。各种基础设施凡是涉及到安全需求,都会优先考虑对称加密算法。对称加密算法的加密密钥和解密密钥相同,加密产生密文,其长度和明文大致相同,对于大多数对称加密算法,加解密过程互逆。
-
优点:与非对称加密方法相比,计算量小,速度快,加密效率高,简单易用,适合于对海量数据进行加密处理 。
-
缺点:秘钥的管理和分发非常困难,不够安全。在数据传送前,发送方和接收方必须商定好秘钥,然后双方都必须要保存好秘钥,如果一方的秘钥被泄露,那么加密信息也就不安全了。
常见对称加密:DES、3DES、AES
DES
DES(Data Encryption Standard,数据加密标准),密钥长度为 64 位,实际密钥只有 56 位。密钥长度太短,现在已经被认为不安全,一般不建议使用 DES 算法。
3DES
3DES(Triple DES、DESede,进行了三重DES加密的算法),就是把 DES 算法的执行了三次,每次的密钥都不一样。3DES也是AES提出之前的过度标准。现在AES已经是最广泛使用的对称算法。
AES
AES(Advanced Encryption Standard,高级数据加密标准),AES是最流行的对称加密算法,AES和DES同为对称分组加密算法,都使用相同的密钥加密数据和解密数据。相比于DES算法密钥长度为56位,AES的密钥长度可以为128位、192位和256位,根据加解密密钥长度的不同,AES算法可分为AES-128、AES-192和AES-256三种。当然密钥越长就越安全,速度也就越慢。
AES在理论上是安全的,对于当前电子计算机和量子计算机的运算能力,除非在数学上有重大突破,AES密码算法仍是不可破解的。
3. 非对称加密算法
1976年以前,所有的加密方法都是使用对称加密,这种加密模式有一个最大弱点:甲方必须把秘钥告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
1976年,人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。这种新的加密模式被称为"非对称加密算法"。
非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥", 公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密;如果用私钥对数据进行加密,那么只有用对应的公钥才能解密。
但严格意义上说,只能使用公钥加密,使用私钥来解密。而使用私钥加密更多的起到签名的作用,让公钥解密来验证身份,因为公钥是要传递的,有泄露风险。
RSA
1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA算法。从那时直到现在,RSA算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有RSA算法。
这种算法非常可靠,密钥越长,它就越难破解。根据已经披露的文献,目前被破解的最长RSA密钥是768个二进制位。也就是说,长度超过768位的密钥,还无法破解(至少没人公开宣布)。因此可以认为,1024位的RSA密钥基本安全,2048位的密钥极其安全。
下面解释一下RSA算法的原理,RSA算法并不难,只需要一点数论知识就可以理解。
1.数学概念
(1)互质关系
如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。
关于互质关系,不难得到以下结论:
-
任意两个质数构成互质关系,比如13和61。
-
一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。
-
如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
-
1和任意一个自然数是都是互质关系,比如1和99。
-
p是大于1的整数,则p和p-1构成互质关系,比如57和56。
-
p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
(2)欧拉函数
任意给定正整数n,请问在小于等于n的正整数之中,有多少个与n构成互质关系?(比如,在1到8之中,有多少个数与8构成互质关系?)
计算这个值的方法就叫做欧拉函数,以φ(n)表示。在1到8之中,与8形成互质关系的是1、3、5、7,所以 φ(n) = 4。
φ(n)的几种情况:
- 如果n=1,则
φ(1) = 1
。因为1与任何数(包括自身)都构成互质关系。 - 如果n是质数,则
φ(n)=n-1
。因为质数与小于它的每一个数,都构成互质关系。比如5与1、2、3、4都构成互质关系。 - 如果n可以分解成两个互质的整数之积,
n = p1 × p2
则φ(n) = φ(p1p2) = φ(p1)φ(p2)
,即积的欧拉函数等于各个因子的欧拉函数之积。比如,φ(56)=φ(8×7)=φ(8)×φ(7)=4×6=24
。
(3)欧拉定理
如果两个正整数a和n互质,则n的欧拉函数 φ(n) 可以让下面的等式成立:
也就是说,a的φ(n)次方被n除的余数为1。
(4)模反元素
如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除,或者说ab被n除的余数是1。
这时,b就叫做a的"模反元素"。
2. 密钥生成的步骤
我们通过一个例子,来理解RSA算法。
第一步,随机选择两个不相等的质数p和q。
选择了61和53。(实际应用中,这两个质数越大,就越难破解。)
第二步,计算p和q的乘积n。
把61和53相乘。
n = 61×53 = 3233
n的长度就是密钥长度。3233写成二进制是110010100001,一共有12位,所以这个密钥就是12位。实际应用中,RSA密钥一般是1024位,重要场合则为2048位。
第三步,计算n的欧拉函数φ(n)。
根据公式:
φ(n) = (p-1)(q-1)
算出φ(3233)等于60×52,即3120。
第四步,随机选择一个整数e,条件是1< e < φ(n),且e与φ(n) 互质。
在1到3120之间,随机选择了17。
但是在实际的使用中,通常,如果是真·随机选取的话,在加解密、签名验证的过程中大概会有超过1000次的模乘运算,所以建议公钥的的值选择是3或65537。这样,公钥加密、私钥签名的模乘运算次数可以降低到2次和17次,可以显著的提高在实际应用中RSA算法的效率。
第五步,计算e对于φ(n)的模反元素d。
所谓"模反元素"就是指有一个整数d,可以使得ed被φ(n)除的余数为1。
ed ≡ 1 (mod φ(n))
这个式子等价于
ed - 1 = kφ(n)
已知 e=17, φ(n)=3120,
17d - 3120k = 1
算出一组整数解为 (d,k)=(2753,-15)
第六步,将n和e封装成公钥,n和d封装成私钥。
例子中,n=3233,e=17,d=2753,所以公钥就是 (3233,17),私钥就是(3233, 2753)。实际应用中,公钥和私钥的数据都采用ASN.1格式表达,这里不是重点。
3. RSA算法的可靠性
回顾上面的密钥生成步骤,一共出现六个数字:
p
q
n
φ(n)
e
d这六个数字之中,公钥用到了两个(n和e),其余四个数字都是不公开的。其中最关键的是d,因为n和d组成了私钥,一旦d泄漏,就等于私钥泄漏。
那么,有无可能在已知n和e的情况下,推导出d?
-
ed ≡1 (mod φ(n))。只有知道e和φ(n),才能算出d。
-
φ(n)=(p-1)(q-1)。只有知道p和q,才能算出φ(n)。
-
n=pq。只有将n因数分解,才能算出p和q。
结论:如果n可以被因数分解,d就可以算出,也就意味着私钥被破解。
可是,大整数的因数分解,这是一个公认的数学难题。目前,除了暴力破解,还没有发现别的有效方法。
维基百科这样写道:
"对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠。
假如有人找到一种快速因数分解的算法,那么RSA的可靠性就会极度下降。但找到这样的算法的可能性是非常小的。今天只有短的RSA密钥才可能被暴力破解。到目前为止,世界上还没有任何可靠的攻击RSA算法的方式。
只要密钥长度足够长,用RSA加密的信息实际上是不能被解破的。"
12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413这是人类已经分解的最大整数,768个二进制位,它等于:
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
7987363089174. 加密和解密
有了公钥和密钥,就能进行加密和解密了。
(1)加密要用公钥 (n,e)
假设A要向B发送加密信息m,他就要用B的公钥 (n,e) 对m进行加密。这里需要注意,m必须是整数(字符串可以取ascii值或unicode值),且m必须小于n。
所谓"加密",就是算出下式的c:
m^e ≡ c (mod n)
B的公钥是 (3233, 17),A的m假设是65,那么可以算出下面的等式:
6517 ≡ 2790 (mod 3233)
于是,c等于2790,A就把2790发给了B。
(2)解密要用私钥(n,d)
B拿到A发来的2790以后,就用自己的私钥(3233, 2753) 进行解密。可以证明,下面的等式一定成立:
c^d ≡ m (mod n)
也就是说,c的d次方除以n的余数为m。现在,c等于2790,私钥是(3233, 2753),那么,B算出
27902753 ≡ 65 (mod 3233)
因此,B知道了A加密前的原文就是65。
至此,"加密–解密"的整个过程全部完成。
优点:
- 加密和解密的密钥不一致,公钥是可以公开的,只需保证私钥不被泄露即可,这样就密钥的传递变的简单很多,从而降低了被破解的几率。
缺点:
-
从上边可以看出,同样安全级别的加密算法,RSA需要更长的密钥。这就使运算速度较慢,较对称密码算法慢几个数量级。且随着大数分解技术的发展,这个长度还在增加,不利于数据格式的标准化。
-
RSA产生密钥很麻烦,受到素数产生技术的限制,加密速度慢,因此,使用RSA只能加密少量数据,大量的数据加密还要靠对称密码算法。实际应用中一般用来加密对称算法的密钥,而密文多用对称加密算法加密传输。
4. 加密的应用
4.1 数字签名和证书
数字签名
数字签名的作用:证明消息是某个特定的人,而不是随随便便一个人发送的(有效性);除此之外,数字签名还能证明消息没有被篡改(完整性)。简单来说,数字签名就是非对称加密的逆应用,用私钥加密消息,用公钥解密消息。
数字签名在发送方:
- 对消息进行哈希计算,得到哈希值
- 利用私钥对哈希值进行加密,生成签名
- 将签名附加在消息后面,一起发送过去
数字签名验证在接收方:
- 收到消息后,提取消息中的签名
- 用公钥对签名进行解密,得到哈希值1。
- 对消息中的正文进行哈希计算,得到哈希值2。
- 比较哈希值1和哈希值2,如果相同,则验证成功。
数字证书
上面的一切都很完美,你用公钥能够解密,说明确实是私钥方发送的,你很放心,但有没有想过,万一这把公钥本身,就被人做了手脚?为了保证“公钥”是可信的,数字证书应运而生。
数字证书一般包含:公钥,证书的数字签名,公钥拥有者的信息。若证书验证成功,这表示该公钥是合法,可信的。
数字证书里有个概念,认证机构(Certification Authority, CA),发送方先把自己的公钥给CA,CA对其进行加密得到加密后的发送方公钥(用的是CA的私钥和CA加密算法),也就是CA的数字证书。
如何生成证书?
- 发送方将公钥A给CA
- CA用自己的私钥,对发送方的公钥和一些相关信息一起加密,生成"数字证书"
- 发送方发送时不仅发送内容、数字签名,还包含发送方的数字证书。
如何验证证书?
接收方拿到后,首先使用CA的公钥验证证书的数字签名,验证通过后则可以使用数字证书中的发送方公钥。CA是第三方机构,CA公钥是公开的,通过其他可信的方式提前获取得到的,因此不可能伪造。
4.2 HTTPS
因为HTTP在传输数据时使用的是明文是不安全的,为了解决这一隐患网景公司推出了SSL安全套接字协议层,SSL是基于HTTP之下TCP之上的一个协议层,是基于HTTP标准并对TCP传输数据时进行加密,所以HPPTS是HTTP+SSL/TCP的简称。
在SSL 3之后SSL重命名为TLS,是更为安全的升级版 SSL。
SSL/TLS协议基本过程包含四次握手,所以常说的HTTPS的七次握手就是TCP的三次加SSL/TLS的四次。
SSL协议的握手过程
(1) 客户端发出请求(ClientHello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步,客户端主要向服务器提供以下信息。
- 支持的协议版本,比如TLS 1.0版。
- 一个客户端生成的随机数,稍后用于生成"对话密钥"。
- 支持的加密方法。
- 支持的压缩方法。
(2) 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。
- 确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。
- 一个服务器生成的随机数,稍后用于生成"对话密钥"。
- 确认使用的加密方法。
- 服务器证书。
(3) 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。如下图
如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。-
一个随机数。该随机数用服务器公钥加密,防止被窃听。
-
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
-
客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称
"pre-master key"
。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。(4) 服务器的最后回应
服务器收到客户端的第三个随机数
pre-master key
之后,计算生成本次会话所用的"会话密钥"。然后,向客户端最后发送下面信息。-
编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。
-
服务器握手结束通知,表示服务器的握手阶段已经结束。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。
参考:
-
SVN Password加密算法(httpd加密算法)
2012-02-22 14:05:22SVN Password加密算法(httpd加密算法) C#代码 -
加密算法总结
2022-02-27 20:12:16加密算法,密码学常见的加密算法可以分成五类:
- 对称加密算法
- 非对称加密算法(也称公钥算法)
- Hash 算法(也称摘要算法)
- 数字签名(Hash&RSA)
- 数字证书(Hash&RSA&CA)。
密码分类 国产商用密码 国际商用密码 对称加密 分组加密/块加密 SM1/SCB2 SM4/SMS4 SM7 DES、IDEA、AES、RC5、RC6 序列加密/流加密 ZUC(祖冲之算法) SSF446 RC4 非对称加密 大数分解 RSA、Rabin 离散对数 SM2 SM9 DH、DSA、ECC 散列(HASH)算法 SM3 MD5、SHA-1、SHA-2 常见HASH算法
已确认不安全:MD2、MD4、MD5、SHA-1
目前为止安全的加密算法:sha256 & sha384 & sha512破解样例
https://blog.csdn.net/qq_32534441/article/details/89669106
对称加密
常见的对称加密算法有AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC4、RC5、RC6、Camellia。
不安全的加密算法(禁止使用):DES、3DES、RC4、AES-128-ECB
推荐使用的加密算法:AES-128(256)-CBC(GCM)、ChaCha20非对称加密算法
https://blog.csdn.net/u014294681/article/details/86705999
RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)RSA:由 RSA 公司发明,是一个支持变长密钥的公共密钥算法,需要加密的文件块的长度也是可变的;
DSA(Digital Signature Algorithm):数字签名算法,是一种标准的 DSS(数字签名标准);
ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。为什么非对称加密算法,比对称加密算法更消耗性能,因为非对称加密算法涉及到了大数运算。
TLS加密套件
https://blog.csdn.net/herongoal/article/details/83414888
https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml国密算法
https://zhuanlan.zhihu.com/p/132352160
1、SM1是一种分组加密算法
对称加密算法中的分组加密算法,其分组长度、秘钥长度都是128bit,算法安全保密强度跟 AES 相当,但是算法不公开,仅以IP核的形式存在于芯片中,需要通过加密芯片的接口进行调用。
采用该算法已经研制了系列芯片、智能IC卡、智能密码钥匙、加密卡、加密机等安全产品,广泛应用于电子政务、电子商务及国民经济的各个应用领域(包括国家政务通、警务通等重要领域)。
2、SM2是非对称加密算法
它是基于椭圆曲线密码的公钥密码算法标准,其秘钥长度256bit,包含数字签名、密钥交换和公钥加密,用于替换RSA/DH/ECDSA/ECDH等国际算法。可以满足电子认证服务系统等应用需求,由国家密码管理局于2010年12月17号发布。
SM2采用的是ECC 256位的一种,其安全强度比RSA 2048位高,且运算速度快于RSA。
3、SM3是一种密码杂凑算法
用于替代MD5/SHA-1/SHA-2等国际算法,适用于数字签名和验证、消息认证码的生成与验证以及随机数的生成,可以满足电子认证服务系统等应用需求,于2010年12月17日发布。
它是在SHA-256基础上改进实现的一种算法,采用Merkle-Damgard结构,消息分组长度为512bit,输出的摘要值长度为256bit。
4、SM4是分组加密算法
跟SM1类似,是我国自主设计的分组对称密码算法,用于替代DES/AES等国际算法。SM4算法与AES算法具有相同的密钥长度、分组长度,都是128bit。于2012年3月21日发布,适用于密码应用中使用分组密码的需求。
5、SM7也是一种分组加密算法
该算法没有公开。SM7适用于非接IC卡应用包括身份识别类应用(门禁卡、工作证、参赛证),票务类应用(大型赛事门票、展会门票),支付与通卡类应用(积分消费卡、校园一卡通、企业一卡通、公交一卡通)。
6、SM9是基于标识的非对称密码算法
用椭圆曲线对实现的基于标识的数字签名算法、密钥交换协议、密钥封装机制和公钥加密与解密算法,包括数字签名生成算法和验证算法,并给出了数字签名与验证算法及其相应的流程。并提供了相应的流程。可以替代基于数字证书的PKI/CA体系。
SM9主要用于用户的身份认证。据新华网公开报道,SM9的加密强度等同于3072位密钥的RSA加密算法,于2016年3月28日发布。
国密即国家密码局认定的国产密码算法。主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
由于SM1、SM4加解密的分组大小为128bit,故对消息进行加解密时,若消息长度过长,需要进行分组,要消息长度不足,则要进行填充。
其他的加密方式
凯撒密码
http://www.metools.info/code/c70.html
移位加密Rot13
https://www.ctftools.com/down/
https://blog.csdn.net/weixin_38168081/article/details/99932438栅栏密码
分行之后拼接
培根密码
https://blog.csdn.net/weixin_42109012/article/details/97644262
猪圈密码
https://www.cnblogs.com/Yuuki-/p/7897171.html
摩斯密码
电报
-
浅谈常见的七种加密算法及实现
2021-02-22 18:00:07数字签名、信息加密是前后端开发都经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、oauth等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的签名加密算法来达到业务目标... -
加密算法--DES对称加密算法详解
2021-02-01 22:48:32加密算法–DES对称加密算法详解 DES全称为Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法,1977年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS),并授权在非密级政府通信中... -
AES加密算法
2021-04-20 10:26:08前言 上一节介绍的3DES,实际上只是DES的一个变体,他通过三重加密...AES算法全称Advanced Encryption Standard,又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分 -
摘要算法和加密算法
2022-04-01 14:04:16概要算法和加密算法的讲解与比较 -
几种常见的加密算法
2020-01-13 14:43:39数据加密的基本过程就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码为“密文”,使其只能在输入相应的密钥之后才能显示出原容,通过这样的途径来达到保护数据不被非法人窃取、阅读的... -
对称加密算法和非对称加密算法
2020-10-15 17:47:18在对称加密算法中,数据发信方将明文( 原始数据 )和加密 密钥 (mi yue)一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。 常用的对称加密算法:AES,RC4,3DES 传输的示意图如下所示: 第二 、非... -
常见的加密算法及详解都在这里!
2019-12-20 00:06:39加密算法,是现在每个软件项目里必须用到的内容。广泛应用在包括了用户登入、数字签名、数据传输等多个场合。那大家都知道那些呢?今天我把常见的加密算法全部整理在这里,供大家学习参考。 首先,大家要知道加密... -
浅谈加密算法 aes
2022-04-07 18:50:24加密算法我们整体可以分为:不可逆加密算法和可逆加密算法。 不可逆加密算法 常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512。他们的特点是,不能从加密后的结果解密出原文,主要... -
区块链加密算法总结
2020-06-14 17:33:15文章目录1、对称加密DES(Data EncryptionStandard)3DES(Triple DES)AES(Advanced EncryptionStandard)2、非对称加密RSA加密法DSA(Digital SignatureAlgorithm)ECC(Elliptic CurvesCryptography)应用数字签名其他场景... -
STM32 加密算法 源码代码(包括AES的5种模式)
2014-09-15 15:00:54对于STM32通信数据加密和EEPROM的内容等加密 有三种 128位CTR 192位CBC 256位ECB -
常用的对称加密算法
2019-10-26 17:20:38需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。 所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和... -
CTF中有关加密算法的相关知识
2022-04-03 14:14:45CTF中也会涉及到一些加密算法的相关知识,在这里了解一波加密算法的基础知识。 常见的一些算法 1.MD5 2.时间戳 3.Base64解码编码 4.ASCll编码 5.URL编码解码 6.unescape 7.AES加密算法 -
基于C语言的AES加密算法实现
2021-12-04 21:14:13本文只说明AES算法的使用