到了新公司后的第一个需求就是对内容做一个加签,然后传给上游,上游客户端进行验签。需求看似简单,也确实简单,但是,背后的知识足够开一门课程、写一篇论文了,这里笔者用这样一个专题来简要整理一下相关的知识。

首先明确几个名词:

加密:发送方利用接收方的公钥对要发送的明文进行加密。

解密:接受方利用自己的私钥进行解密。

公钥和私钥配对的,用公钥加密的文件,只有对应的私钥才能解密。当然也可以反过来,用私钥加密,用对应的公钥进行解密。

签名:发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,得到的就是这个报文对应的数字签名。通常来说,发送方会把数字签名和报文原文一并发送给接受者。

验签:接收方得到原始报文和数字签名后,用同一个哈希函数从报文中生成摘要A,另外,用发送方提供的公钥对数字签名进行解密,得到摘要B,对比A和B是否相同,就可以得知报文有没有被篡改过。

数字签名的作用:

一是能确定消息确实是由发送方签名并发出来的,也就是验证发送的源头,因为别人假冒不了发送方的签名。

二是数字签名能确定消息的完整性,也就是防篡改。

存在的问题及解决方案(数字信封):

很容易看得出来,数字签名技术有一个问题,就是原始报文是明文传输的,这对一些敏感内容来说通常是不合适的,所以有些时候,这两种技术会结合起来使用。

发送方用自己的私钥完成数字签名,然后再用接收方的公钥对报文进行加密,将数字签名和报文传送给接收方。

接收方在拿到密文和数字签名后,先用自己的私钥对密文进行解密,得到明文,然后再用发送方提供的公钥进行验签,确保发送方身份的准确性,以及报文并没有被篡改过。

那么从上面的过程中我们可以总结几个关键的流程,暂时忽略加密报文的部分,这个和验签关系不大,主要是验签部分,大体的流程是这样的:

一、发送方(RSAwithSHA、RSAwithMD5):

1.对传输的报文进行摘要,主要的算法有MD5和SHA

2.对摘要用自己的私钥进行加密生成签名,一般用到的算法如RSA(非对称加密算法/数字签名算法,这种加密算法的特点主要是密钥的变化,DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了)

3.传输报文及签名

二、接收方:

1.对接收到的报文用同样的算法进行摘要

2.用发送方的公钥对发送方的签名进行解密得到发送方的摘要

3.对比两份摘要看是否有不同以验证是否被篡改

那么这里包含两个知识点,摘要算法和加密算法

首先是摘要算法,说到摘要首先要说HASH

Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
了解了hash基本定义,就不能不提到一些著名的hash算法,MD5和SHA1可以说是目前应用最广泛的Hash算法,而它们都是以MD4为基础设计的。那么他们都是什么意思呢?

MD4(RFC1320)是MIT的RonaldL.Rivest在1990年设计的,MD是MessageDigest的缩写。它适用在32位字长的处理器上用高速软件实现--它是基于32位操作数的位操作来实现的。
MD5(RFC1321)是Rivest于1991年对MD4的改进版本。它对输入仍以512位分组,其输出是4个32位字的级联,与MD4相同。MD5比MD4来得复杂,并且速度较之要慢一点,但更安全,在抗分析和抗差分方面表现更好。

MD5是一种不可逆的加密算法,目前是最牢靠的加密算法之一,尚没有能够逆运算的程序被开发出来,它对应任何字符串都可以加密成一段唯一的固定长度的代码。
那么它有什么用呢?很简单,通过它可以判断原始值是否正确(是否被更改过)。一般用于密码的加密。而我们所提供的MD5校验码就是针对安装程序的唯一对应的一段代码。你可以使用任何MD5运算器对下载的文件进行运算,运算出来的结果如果完全符合我们提供的MD5校验码,那么说明你下载的这个程序没有被中途修改过。
这个特征码有如下特性,首先它不可逆,例如我有一段秘密的文字如:”MySecretWords”,经算法变换后得到MD5码(b9944e9367d2e40dd1f0c4040d4daaf7),把这个码告诉其他人,他们根据这个MD5码是没有系统的方法可以知道你原来的文字是什么的。
其次,这个码具有高度的离散性,也就是说,原信息的一点点变化就会导致MD5的巨大变化,例如”ABC”MD5(902fbdd2b1df0c4f70b4a5d23525e932)和”ABC”(多了一空格)MD5(12c774468f981a9487c30773d8093561)差别非常大,而且之间没有任何关系,也就是说产生的MD5码是不可预测的。
最后由于这个码有128位那么长,所以任意信息之间具有相同MD5码的可能性非常之低,通常被认为是不可能的。
所以一般认为MD5码可以唯一地代表原信息的特征,通常用于密码的加密存储,数字签名,文件完整性验证等。
SHA1是由NISTNSA设计为同DSA一起使用的,它对长度小于264的输入,产生长度为160bit的散列值,因此抗穷举(brute-force)性更好。SHA-1设计时基于和MD4相同原理,并且模仿了该算法。SHA-1是由美国标准技术局(NIST)颁布的国家标准,是一种应用最为广泛的hash函数算法,也是目前最先进的加密技术,被政府部门和私营业主用来处理敏感的信息。而SHA-1基于MD5,MD5又基于MD4。

由于MD5 与SHA-1均是从MD4 发展而来,它们的结构和强度等特性有很多相似之处,SHA-1MD5 的最大区别在于其摘要比MD5 摘要长 32 比特。对于强行攻击,产生任何一个报文使之摘要等于给定报文摘要的难度:MD5 是2128 数量级的操作,SHA-1 是2160 数量级的操作。产生具有相同摘要的两个报文的难度:MD5是 264 是数量级的操作,SHA-1 是280 数量级的操作。因而,SHA-1 对强行攻击的强度更大。但由于SHA-1 的循环步骤比MD5 多(80:64)且要处理的缓存大(160 比特:128 比特),SHA-1 的运行速度比MD5 慢。

说完了摘要算法,接下来就是加密算法:

这个部分…无法详细说,因为如果要说的话,内容实在太多,从数学基础到推导过程,足够写一篇论文的了,所以这里,就简单说一下相关知识吧。

首先说一下,以RSA1024为例,RSA是算法名,而1024则指的是秘钥的长度,RSA算法密钥长度的选择是安全性和程序性能平衡的结果,密钥长度越长,安全性越好,加密解密所需时间越长。

1. 非对称加密算法中1024 bit密钥的强度相当于对称加密算法80bit密钥的强度。有资料上说以当前的软硬件水平,破解1024bit的RSA加密密文,需要一套10亿美金的系 统使用若干十年的时间,所以2015年前,1024bit的还无需太担心暴力破解的危险。

2. 密钥长度增长一倍,公钥操作所需时间增加约4倍,私钥操作所需时间增加约8倍,公私钥生成时间约增长16倍。

3. 一次能加密的密文长度与密钥长度成正比, len_in_byte(raw_data) = len_in_bit(key)/8 -11,如1024bit的密钥,一次能加密的内容长度为 1024/8 -11 = 117 byte。所以非对称加密一般都用于加密对称加密算法的密钥,而不是直接加密内容。

4. 加密后密文的长度为密钥的长度,如密钥长度为1024b(128Byte),最后生成的密文固定为 1024b(128Byte)
RSA的1024位是指公钥及私钥分别是1024bit,也就是1024/8=128 Bytes

参考文献:

http://lvbin0502.iteye.com/blog/1409802

http://stark-summer.iteye.com/blog/1313884

http://blog.sina.com.cn/s/blog_4fcd1ea301012o4q.html

http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html

加密、解密、加签、验签专题相关推荐

  1. python实现RSA加密解密 及 签名验签功能

    本篇写一下python实现RSA的加密解密功能.私钥签名 公钥验签功能. 主要分三部分来介绍 生成私钥和公钥 脚本如下,运行后会生成public.pem(公钥) 和 private.pem(私钥) d ...

  2. java rsa加密 加签_RSA加密解密与加签验签

    RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年7月首次在美国公布 ...

  3. java支付宝rsa2签名,使用支付宝SDK进行RSAj加签验签以及加密解密

    /** * 支付宝 sdk 加签验签测试 * * @author 码农猿 */ public class SignDemo { /** * 公钥 */ private static final Str ...

  4. 如何使用RSA 对数据加解密和签名验签?一篇文章带你搞定

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 三分割据纡筹策,万古云霄一羽毛. ...

  5. 国密SM4加解密SM2签名验签COM组件DLL

    提供给第三方软件,调用COM组件DLL方式进行实现,如delphi.PB等. 基于C#编写的COM组件DLL,可实现SM2签名验签,SM4加解密,100%适用于黑龙江省国家医保接口中进行应用. 功能包 ...

  6. 聊一聊关于加解密、加签验签的那些事

    面对MD5.SHA.DES.AES.RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密.私钥解密.私钥加签.公钥验签.这些都什么鬼?或许在你日常工作没有听说过这些名词,但是一旦你要 ...

  7. 速看: 加解密、加签验签,你想要的都在这了

    点击蓝色"java大数据修炼之道"关注我哟加个"星标",每晚21:00,一起学技术 来源: jianshu.com/p/5e9fe1fff6a3 作者: 不学无 ...

  8. 前后端RSA互相加解密、加签验签、密钥对生成(Java)

    目录 一.序言 二.关于PKCS#1和PKCS#8格式密钥 1.简介 2.区别 二.关于JSEncrypt 三.关于jsrsasign 四.前端RSA加解密.加验签示例 1.相关依赖 2.crypto ...

  9. 利用md5加密实现API接口的加签验签

    1.背景 我现在有几个公开的接口需要开放给第三方厂商,第三方厂商通过调用我的接口获取数据,由于这些接口放开了登录的拦截,而且是直接暴露在公网上的,因此想给这几个接口加上权限的验证,即加签验签. 2.技 ...

  10. 关于加解密、加签验签的那些事

    来源:r6d.cn/acJae 面对MD5.SHA.DES.AES.RSA等等这些名词你是否有很多问号?这些名词都是什么?还有什么公钥加密.私钥解密.私钥加签.公钥验签.这些都什么鬼?或许在你日常工作 ...

最新文章

  1. LNMP - Nginx配置防盗链
  2. 【问链财经-区块链基础知识系列】 第二十二课 贸易金融区块链平台的技术机理与现实意义
  3. 做倒计时一天_不知道这6个管理时间的工具,做不好时间管理
  4. maven 安装m2e 报错
  5. 在本地库不连接远远程库的情况下操作远程库-----sql server
  6. 高仿带感魔性病毒源码+成品(最近很火的)
  7. 【汇编语言】镜像迁移能力之一通百通——由代码段和CS:IP的原理,掌握一类寄存器的使用
  8. 主线程如何与次线程用全局变量通讯
  9. 用javascript实现(页面正在加载的效果)
  10. 一个小小的总结--关于写博客这件事
  11. pytorch 绘制多个算法loss_PyTorch线性模型和梯度下降
  12. C#中async/await中的异常处理
  13. 编程调节Win7/Win8系统音量的一种方法
  14. 电脑经常自动重启的原因
  15. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))
  16. 51单片机之数据转移指令MOV、MOVX、MOVC等
  17. 时序分析基本概念介绍Timing Derate
  18. Windows7UltimateSP1x64安装及一些设置
  19. 新入手的Mac安装开发软件
  20. 震网三代cve_2017_8464漏洞复现

热门文章

  1. html文件离线可以打开,HTML5的离线储存怎么使用
  2. windows连接FTP服务器
  3. (原创)浅析Lab模式的校色规律2009.07.12
  4. 整合PDF和Java技术
  5. 数据可视化的设计原则
  6. iphone丢失后找回
  7. oracle手表,沛纳海_沛纳海Luminor 1950 44毫米3日动力储存飞返计时自动陶瓷腕表|腕表之家xbiao.com...
  8. python爬虫简单爬取爱思助手壁纸
  9. Django基础知识学习
  10. (五)MyBatis调用oracle存储过程