对于加密的总结(AES,RSA)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于加密的总结(AES,RSA)相关的知识,希望对你有一定的参考价值。

参考技术A

跟第三方联调的时候会碰到各种加密算法,所以总结一下。

AES不是将拿到的明文一次性加密,而是分组加密,就是先将明文切分成长度相等的块,每块大小128bit,再对每一小块进行加密。那么问题就来了,并不是所有的原始明文串能被等分成128bit,例如原串大小200bit,那么第二个块只有72bit,所以就需要对第二个块进行填充处理,让第二个块的大小达到128bit。常见的填充模式有

不进行填充,要求原始加密串大小必须是128bit的整数倍;

假设块大小8字节,如果这个块跟8字节还差n个字节,那么就在原始块填充n,直到满8字节。例:块1,2,3,跟8字节差了5个字节,那么补全后的结果1,2,3,5,5,5,5,5后面是五个5,块1,2,3,..7跟8字节差了1个字节,那么补全后就是1,2,3,...,7,1,就是补了一个1。

如果恰好8字节又选择了PKCS5Padding填充方式呢?块1,2,3...8填充后变成1,2,3...8,8...8,原串后面被补了8个8,这样做的原因是方便解密,只需要看最后一位就能算出原块的大小是多少。

跟PKCS5Padding的填充方式一样,不同的是,PKCS5Padding只是对8字节的进行填充,PKCS7Padding可以对1~256字节大小的block进行填充。openssl里aes的默认填充方式就是PKCS7Padding

AES有多种加密模式,包括:ECB,CBC,CTR,OCF,CFB,最常见的还是ECB和CBC模式。

最简单的一种加密模式,每个块进行独立加密,块与块之间加密互不影响,这样就能并行,效率高。
虽然这样加密很简单,但是不安全,如果两个块的明文一模一样,那么加密出来的东西也一模一样。

openssl的相关函数:

CBC模式中引入了一个新的概念,初始向量iv。iv的作用就是为了防止同样的明文块被加密成同样的内容。原理是第一个明文块跟初始向量做异或后加密,第二个块跟第一个密文块做异或再加密,依次类推,避免了同样的块被加密成同样的内容。

openssl相关函数:

敲黑板!! 所以跟第三方对接的时候,如果对面说他们用aes加密,务必对他们发起灵魂三问:

签名的作用是让接受方验证你传过去的数据没有被篡改;加密的作用是保证数据不被窃取。

原理:你有一个需要被验签的原串A。

步骤一:选择hash算法将A进行hash得到hash_a;

步骤二:将hash_a进行加密,得到加密值encrypt_a;

步骤三:将原串A和加密的encrypt_a发给第三方,第三方进行验签。第三方先解密encrypt_a,得到一个hash值hash_a1,然后对原串A使用同样的hash算法进行hash,得到的即为加密前的hash_a,如果hash_a = hash_a1, 那么验签成功。

rsa使用私钥对信息加密来做签名,使用公钥解密去验签。
openssl相关函数:

注意:两个函数中的m,是原串hash后的值,type表示生成m的算法,例如NID_sha256表示使用sha256对原串进行的hash,返回1为签名成功或者验签成功,-1位为失败。

再次敲黑板!! 所以如果第三方说使用rsa验签,要让对方告知他们的hash算法。

首先明确,私钥加密不等于签名。加密的时候,使用使用公钥加密,第三方使用你的私钥进行解密。
openssl里公钥加密函数为RSA_public_encrypt,私钥解密函数为RSA_private_decrypt,具体的可以自己去查看下官方文档。

rsa也涉及到了填充方式,所以对接的时候也要问清楚

在使用公钥进行加密时,会发现每次加密出的结果都不一样,但使用私钥加密时,每次的结果都一样,网上查了一圈,说是因为填充方式的原因。

官方文档说明:

那么为什么一定要使用私钥做签名,公钥做加密,而不是公钥做签名,私钥做加密呢?
举个栗子:

Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

【前言】

本文简单的介绍了加密技术相关概念,最后总结了java中现有的加密技术以及用法和样例

【最简单的加密】

1.简单的概念

明文:加密前的信息

密文:机密后的信息

算法:加密或解密的算法

密钥:算法使用的钥匙(读作miyao。正确应该是miyue,可是大家都读miyao)


2.简单的样例

将123456每位数字都加1后得到234567,

当中123456就是明文。234567就是密文。加密密钥就是1,加密算法是每位加


3.对称加密和非对称加密

以上为例。

123456-->234567的加密密钥就是1,加密算法是每位+

234567-->123456的解密密钥也是1,解密算法是每位-

当中加密算法(+)和解密算法(-)相对称,这样的加密算法就称作对称加密,

相同,假设加密算法和解密算法不正确称就称之为非对称加密。


4.算法举例

对称加密算法:DES算法。3DES算法,TDEA算法。Blowfish算法。RC5算法,IDEA算法,AES算法

非对称加密算法:RSA、Elgamal、背包算法、Rabin、D-H、ECC。

经典的哈希算法:MD2、MD4、MD5 和 SHA-1(目的是将随意长输入通过算法变为固定长输出,且保证输入变化一点输出都不同,且不能反向解密)


5.经典的算法
AES(对称)。RSA(非对称),MD5,SHA-1(哈希)

【算法举例】

1.base64

不是加密算法,是一种编码方式,因为加密后都是byte[],为了可读性。一般将byte[]转为base64编码

样例:Java 加密 base64 encode 

2.md5

也不是算法。是消息摘要算法第五版,是一种哈希算法,一般用于单向加密

样例:Java 加密 MD5 

3.AES

对称加密算法,DES的代替者

样例:Java 加密 AES 对称加密算法 

4.RSA

待更新













以上是关于对于加密的总结(AES,RSA)的主要内容,如果未能解决你的问题,请参考以下文章

Java 加密解密 对称加密算法 非对称加密算法 MD5 BASE64 AES RSA

前端AES + RSA加密

RSA+AES请求组合加密

AES加解密使用总结

我的Android进阶之旅------>Android采用AES+RSA的加密机制对http请求进行加密

RSA非对称加密和AES对称加密