Files
API-Security/aes_rsa
mahongyin ba6eb721e1 AES
2021-03-24 18:04:50 +08:00
..
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00
AES
2021-03-24 18:04:50 +08:00

aes-rsa-java AES+RSA结合应用java示例

介绍

随着Internet网的广泛应用信息安全问题日益突出以数据加密技术为核心的信息安全技术也得到了极大的发展。 目前的数据加密技术根据加密密钥类型可分私钥加密(对称加密)系统和公钥加密(非对称加密)系统。对称加密算法是较传统的加密体制, 通信双方在加/解密过程中使用他们共享的单一密钥,鉴于其算法简单和加密速度快的优点,目前仍然是主流的密码体制之一。 最常用的对称密码算法是数据加密标准DES算法但是由于DES密钥长度较短已经不适合当今分布式开放网络对数据加密安全性的要求。 最后一种新的基于Rijndael算法对称高级数据加密标准AES取代了数据加密标准DES。 非对称加密由于加/解密钥不同公钥加密私钥解密密钥管理简单也得到广泛应用。RSA是非对称加密系统最著名的公钥密码算法。

加解密流程

  1. 服务器端(server)和客户端(client)分别生成自己的密钥对
  2. server和client分别交换自己的公钥
  3. client生成AES密钥(aesKey)
  4. client使用自己的RSA私钥(privateKey)对请求明文数据(params)进行数字签名
  5. 将签名加入到请求参数中然后转换为json格式
  6. client使用aesKey对json数据进行加密得到密文(data)
  7. client使用sever的RSA公钥对aesKey进行加密(encryptkey)
  8. 分别将data和encryptkey作为参数传输给服务器端

服务器端进行请求响应时将上面流程反过来即可

文章详解

开放接口的安全验证方案(AES+RSA)

随着密码分析技术的提高新的数据加密标准AES取代了过时的DES。文章在阐述AES/RSA加密算法的基础上分别给出了利用AES/RSA实现客户端/服务器端网络数据传输的加密流程。最后在比较AES算法和RSA算法基础上将AES与RSA相结合提出一种新的数据加密方案。

基本需求及概念

随着Internet网的广泛应用信息安全问题日益突出以数据加密技术为核心的信息安全技术也得到了极大的发展。目前的数据加密技术根据加密密钥类型可分私钥加密对称加密系统和公钥加密非对称加密系统[1]。对称加密算法是较传统的加密体制,通信双方在加/解密过程中使用他们共享的单一密钥鉴于其算法简单和加密速度快的优点目前仍然是主流的密码体制之一。最常用的对称密码算法是数据加密标准DES算法但是由于DES密钥长度较短已经不适合当今分布式开放网络对数据加密安全性的要求。最后一种新的基于Rijndael算法对称高级数据加密标准AES取代了数据加密标准DES。非对称加密由于加/解密钥不同公钥加密私钥解密密钥管理简单也得到广泛应用。RSA是非对称加密系统最著名的公钥密码算法。

AES算法

基本原理及算法流程

美国国家标准和技术研究所NIST经过三轮候选算法筛选从众多的分组密码中选中Rijndael算法作为高级加密标准AES。Rijndael密码是一个迭代型分组密码分组长度和密码长度都是可变的分组长度和密码长度可以独立的指定为128比特192比特或者256比特。AES的加密算法的数据处理单位是字节128位的比特信息被分成16个字节按顺序复制到一个4*4的矩阵中称为状态stateAES的所有变换都是基于状态矩阵的变换。 用Nr表示对一个数据分组加密的轮数加密轮数与密钥长度的关系如表1所示。在轮函数的每一轮迭代中包括四步变换分别是字节代换运算(ByteSub())、行变换(ShiftRows())、列混合(MixColumns())以及轮密钥的添加变换AddRoundKey()[3],其作用就是通过重复简单的非线形变换、混合函数变换,将字节代换运算产生的非线性扩散,达到充分的混合,在每轮迭代中引入不同的密钥,从而实现加密的有效性。 表1 是三种不同类型的AES加密密钥分组大小与相应的加密轮数的对照表。加密开始时输入分组的各字节按表2 的方式装入矩阵state中。如输入ABCDEFGHIJKLMNOP则输入块影射到如表2的状态矩阵中。 表1

|AES类型| 密钥长度 | 分组长度 | 加密轮数|
|AES-128|  4字     |   4字    |   10    |
|AES-192|  6字     |   4字    |   12    |
|AES-256|  8字     |   4字    |   14    |

表2

| A | E | I | M |
| B | F | J | N |
| C | G | K | O |
| D | H | L | P |
  1. 字节代换运算(ByteSub()) 字节代换运算是一个可逆的非线形字节代换操作对分组中的每个字节进行对字节的操作遵循一个代换表即S盒。S盒由有限域 GF28上的乘法取逆和GF2上的仿射变换两步组成。
  2. 行变换ShiftRows() 行变换是一种线性变换其目的就是使密码信息达到充分的混乱提高非线形度。行变换对状态的每行以字节为单位进行循环右移移动字节数根据行数来确定第0行不发生偏移第一行循环右移一个字节第二行移两个依次类推。
  3. 列混合变换MixColumns() 列变换就是从状态中取出一列表示成多项式的形式后用它乘以一个固定的多项式a(x),然后将所得结果进行取模运算,模值为 x4+1。其中a(x)={03}x3+{02}x2+{01}x+{02}, 这个多项式与x4+1互质因此是可逆的。列混合变换的算术表达式为s(x)= a(x) s(x),其中, s(x)表示状态的列多项式。
  4. 轮密钥的添加变换AddRoundKey() 在这个操作中轮密钥被简单地异或到状态中轮密钥根据密钥表获得其长度等于数据块的长度Nb。

AES算法流程

对于发送方它首先创建一个AES私钥并用口令对这个私钥进行加密。然后把用口令加密后的AES密钥通过Internet发送到接收方。发送方解密这个私钥并用此私钥加密明文得到密文密文和加密后的AES密钥一起通过Internet发送到接收方。接收方收到后再用口令对加密密钥进行解密得到AES密钥最后用解密后的密钥把收到的密文解密成明文。图1中是这个过程的实现流程。 图1 img

RSA算法

基本原理及流程

RSA是在1977年发明RSA密码系统的三个人的名字的首字母的缩写他们是Ron Rivest、Adi Shamir和Leonard Adleman。它是第一个公钥加密算法在很多密码协议中都有应用如SSL和S/MIME。RSA算法是基于大质数的因数分解的公匙体系。简单的讲就是两个很大的质数一个作为公钥另一个作为私钥如用其中一个加密则用另一个解密。密钥长度从40到2048位可变密钥越长加密效果越好但加密解密的开销也大。RSA算法可简单描述如下

公开密钥n=pqpq为两个不同的很大的质数p和q必须保密
将(p-1)和(q-1)相乘得到φ(n)
选择一个整数e (1<e<φ(n))与φ(n)互质
秘密密钥d=e-1modφ(n)即计算一个数字d使得它满足公式 de=1 modφ(n)
加密c=mc(mod n) 
解密m=cd(mod n)m为明文c为密文。

RSA算法实现流程

首先接收方创建RSA密匙对即一个公钥和一个私钥公钥被发送到发送方,私钥则被保存在接收方。发送方在接收到这个公钥后,用该公钥对明文进行加密得到密文然后把密文通过网络传输给接收方。接收方在收到它们后用RSA私钥对收到的密文进行解密最后得到明文。图2是整个过程的实现流程。 图2 img

AES与RSA相结合数据加密方案

RSA算法是公开密钥系统的代表其安全性建立在具有大素数因子的合数其因子分解困难这一法则之上的。Rijndael算法作为新一代的高级加密标准运行时不需要计算机有非常高的处理能力和大的内存操作可以很容易的抵御时间和空间的攻击在不同的运行环境下始终能保持良好的性能。这使AES将安全高效性能方便灵活性集于一体理应成为网络数据加密的首选。相比较因为AES密钥的长度最长只有256比特可以利用软件和硬件实现高速处理而RSA算法需要进行大整数的乘幂和求模等多倍字长处理处理速度明显慢于AES[5]所以AES算法加解密处理效率明显高于RSA算法。在密钥管理方面因为AES算法要求在通信前对密钥进行秘密分配解密的私钥必须通过网络传送至加密数据接收方而RSA采用公钥加密私钥解密或私钥加密公钥解密加解密过程中不必网络传输保密的密钥所以RSA算法密钥管理要明显优于AES算法。 从上面比较得知由于RSA加解密速度慢不适合大量数据文件加密因此在网络中完全用公开密码体制传输机密信息是没有必要也是不太现实的。AES加密速度很快但是在网络传输过程中如何安全管理AES密钥是保证AES加密安全的重要环节。这样在传送机密信息的双方如果使用AES对称密码体制对传输数据加密同时使用RSA不对称密码体制来传送AES的密钥就可以综合发挥AES和RSA的优点同时避免它们缺点来实现一种新的数据加密方案。加解密实现流程如图(3)。 图3 img

具体过程是先由接收方创建RSA密钥对接收方通过Internet发送RSA公钥到发送方同时保存RSA私钥。而发送方创建AES密钥并用该AES密钥加密待传送的明文数据同时用接受的RSA公钥加密AES密钥最后把用RSA公钥加密后的AES密钥同密文一起通过Internet传输发送到接收方。当接收方收到这个被加密的AES密钥和密文后首先调用接收方保存的RSA私钥并用该私钥解密加密的AES密钥得到AES密钥。最后用该AES密钥解密密文得到明文。

AES+RSA结合最佳实践

基本要求

  1. 保证传输数据的安全性
  2. 保证数据的完整性
  3. 能够验证客户端的身份

基本流程

请求
1. 服务器端(server)和客户端(client)分别生成自己的密钥对
2. server和client分别交换自己的公钥
3. client生成AES密钥(aesKey)
4. client使用自己的RSA私钥(privateKey)对请求明文数据(params)进行数字签名
5. 将签名加入到请求参数中然后转换为json格式
6. client使用aesKey对json数据进行加密得到密文(data)
7. client使用sever的RSA公钥对aesKey进行加密(encryptkey)
8. 分别将data和encryptkey作为参数传输给服务器端

服务器端进行请求响应时将上面流程反过来即可

参考:

  1. RSA密钥生成方法参考通过openssl工具生成RSA的公钥和私钥(opnssl工具可在互联网中下载到里面包含此工具)

    打开openssl文件夹下的bin文件夹执行openssl.exe文件 1生成RSA私钥 输入“生成命令.txt”文件中“genrsa -out rsa_private_key.pem 1024”并回车得到生成成功的结果如下图

    img

    此时我们可以在bin文件夹中看到一个文件名为rsa_private_key.pem的文件用记事本方式打开它可以看到-----BEGIN RSA PRIVATE KEY-----开头,-----END RSA PRIVATE KEY-----结尾的没有换行的字符串,这个就是原始的私钥。

    2把RSA私钥转换成PKCS8格式 输入命令pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt并回车当前界面中会直接显示出生成结果这个结果就是PKCS8格式的私钥如下图

    img

    右键点击openssl窗口上边边缘选择编辑→标记选中要复制的文字如上图 此时继续右键点击openssl窗口上边边缘选择编辑→复制 把复制的内容粘土进一个新的记事本中可随便命名只要知道这个是PKCS8格式的私钥即可。

    3生成RSA公钥 输入命令rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem并回车得到生成成功的结果如下图

    img

    此时我们可以在bin文件夹中看到一个文件名为rsa_public_key.pem的文件用记事本方式打开它可以看到-----BEGIN PUBLIC KEY-----开头,-----END PUBLIC KEY-----结尾的没有换行的字符串,这个就是公钥。

    详情见开放平台对于密钥生成说明

    注意:请妥善保管好生成的公私钥!

    :点此查看如何上传公钥