一.对称加密算法
含义:
在对称加密算法中,数据发信方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去。收信方收到密文后,若想解读原文,则需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在对称加密算法中,使用的密钥只有一个,发收信双方都使用这个密钥对数据进行加密和解密,这就要求解密方事先必须知道加密密钥。
种类:
。
DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法,RC2、RC4
DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法,RC2、RC4
DES ——密钥短 使用时间长 硬件计算快于软件
IDEA——个人使用不受专利限制 可抵抗差分攻击 基于三个群
AES ——可变密钥长 可变分组长
以上三个属于块式 明文按分组加密
RC4 ——流式加密 不需填充明文 密钥长度可变
IDEA——个人使用不受专利限制 可抵抗差分攻击 基于三个群
AES ——可变密钥长 可变分组长
以上三个属于块式 明文按分组加密
RC4 ——流式加密 不需填充明文 密钥长度可变
对称加密算法的四种应用模式:
加密模式(英文名称及简写)
|
中文名称
|
Electronic Code Book(ECB)
|
电子密码本模式
|
Cipher Block Chaining(CBC)
|
密码分组链接模式
|
Cipher Feedback Mode(CFB)
|
加密反馈模式
|
Output Feedback Mode(OFB)
|
输出反馈模式
|
ECB:最基本的加密模式,也就是通常理解的加密,相同的明文将永远加密成相同的密文,无初始向量,容易受到密码本重放攻击,一般情况下很少用。
CBC:明文被加密前要与前面的密文进行异或运算后再加密,因此只要选择不同的初始向量,相同的密文加密后会形成不同的密文,这是目前应用最广泛的模式。CBC加 密 的密文是上下文相关的,但明文的错误不会传递到后续分组,但如果一个分组丢失,后面的分组将全部作废(同步错误)。
CFB:类似于自同步序列密码,分组加密后,按8位分组将密文和明文进行移位异或后得到输出同时反馈回移位寄存器,优点最小可以按字节进行加解密,也可以是n位的, CFB也是上下文相关的,CFB模式下,明文的一个错误会影响后面的密文(错误扩散)。
OFB:将分组密码作为同步序列密码运行,和CFB相似,不过OFB用的是前一个n位密文输出分组反馈回移位寄存器,OFB没有错误扩散问题。
二.非对称加密算法
含义:
非对称加密算法非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
种类:
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
工作原理:
非对称加密算法非对称加密算法(asymmetric cryptographic algorithm)又名“公开密钥加密算法”,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。
种类:
RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
工作原理:
1.向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
4.A将这个消息发给B(已经用B的公钥加密消息)。
5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥。
三.哈希(散列)算法
含义:
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
种类:
基于哈希的消息验证模式 (HMAC), MD2, MD4, MD5,消息摘要, 安全哈希算法 (SHA-1)
哈希算法将任意长度的二进制值映射为固定长度的较小二进制值,这个小的二进制值称为哈希值。哈希值是一段数据唯一且极其紧凑的数值表示形式。如果散列一段明文而且哪怕只更改该段落的一个字母,随后的哈希都将产生不同的值。要找到散列为同一个值的两个不同的输入,在计算上是不可能的,所以数据的哈希值可以检验数据的完整性。一般用于快速查找和加密算法。
种类:
基于哈希的消息验证模式 (HMAC), MD2, MD4, MD5,消息摘要, 安全哈希算法 (SHA-1)
代码示例:
MD5
cout<<"算法名称 "<<Weak1::MD5::StaticAlgorithmName()<<endl;
cout<<"请输入要加密的字符"<<endl;
byte message[128];
byte m[16];
cin.getline((char*)message,128);
cMd5.CalculateDigest(m,message,strlen((char*)message));
for (int i=0;i<16;i++)
{
printf("%X",m[i]);
}
SHA256(SHA1,SHA128等类似)SHA256 cSha256;
cout<<"算法名称 "<<SHA1::StaticAlgorithmName()<<endl;
cout<<"请输入要加密的字符"<<endl;
byte message[128];
cout<<cSha1.DigestSize()<<endl;
cout<<cSha256.DigestSize()<<endl;
byte m[20]={0};
cin.getline((char*)message,128);
cSha1.CalculateDigest(m,message,strlen((char*)message));
for (int i=0;i<20;i++)
{
printf("%X",m[i]);
}
其他算法
BASE32
string str="123456",encded,dd;
StringSource ss(str, true,new Base32Encoder(new StringSink(encded)));
cout<<encded;
StringSource sd(encded,true,new Base32Decoder(new StringSink(dd)));
cout<<dd;
BASE64(非标准可以改密码表) string str="123456",encded,dd;
StringSource ss(str, true,new Base64Encoder(new StringSink(encded)));
cout<<encded;
StringSource sd(encded,true,new Base64Decoder(new StringSink(dd)));
cout<<dd;
四.字节与位数换算
1字节=8位
8字节 =64位
16字节=128位
24字节=192位
32字节=256位
64字节=512位