加密算法分类

加密算法分类

严格意义上加密算法分为

  • 对称加密算法
  • 非对称加密算法

由于散列算法所计算出来的散列值(Hash Value)具有不可逆(无法逆向演算回原本的数值)的性质,因此可有效的保护密码

  • 不可逆加密算法–hash(散列)算法

不可逆加密

不可逆加密算法的特征是加密过程中不需要使用密钥,
输入明文后由系统直接经过加密算法处理成密文,
这种加密后的数据是无法被解密的,
只有重新输入明文,
并再次经过同样不可逆的加密算法处理,
得到相同的加密密文并被系统重新识别后,
才能真正解密。

Hash(散列)函数

简介

所有散列函数都有如下一个基本特性:如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。
这个特性是散列函数具有确定性的结果,具有这种性质的散列函数称为单向散列函数。
但另一方面,散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的,
但也可能不同,这种情况称为“散列碰撞(collision)”,这通常是两个不同长度的输入值,刻意计算出相同的输出值。
输入一些数据计算出散列值,然后部分改变输入值,一个具有强混淆特性的散列函数会产生一个完全不同的散列值。

典型的散列函数都有非常大的定义域,比如SHA-2最高接受(264-1)/8长度的字节字符串。
同时散列函数一定有着有限的值域,比如固定长度的比特串。在某些情况下,散列函数可以设计成具有相同大小的定义域和值域间的单射。
在密码学中,散列函数必须具有不可逆性。

了解关于更多hash算法的介绍

md5信息摘要算法简单举例
import hashlib
import random
import string


def pwd():
    ran_str = ''.join(random.sample(string.printable, 8))
    return hashlib.md5(ran_str.encode(encoding='utf-8')).hexdigest()
print(pwd())

对称加密

简介

对称密钥算法又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。
这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。
事实上,这组密钥成为在两个或多个成员间的共同秘密,以便维持专属的通信联系。
与公开密钥加密相比,要求双方获取相同的密钥是对称密钥加密的主要缺点之一。

常见的对称加密算法有AES、ChaCha20、3DES、Salsa20、DES、Blowfish、IDEA、RC5、RC6、Camellia。

对称加密的速度比公钥加密快很多,在很多场合都需要对称加密。

AES-ECB加密简单举例
from Crypto.Cipher import AES
import base64


BLOCK_SIZE = 16  # Bytes
pad = lambda s: s + (BLOCK_SIZE - len(s) % BLOCK_SIZE) * \
                chr(BLOCK_SIZE - len(s) % BLOCK_SIZE)
unpad = lambda s: s[:-ord(s[len(s) - 1:])]


def aesEncrypt(key, data):
    """
    AES的ECB模式加密方法
    :param key: 密钥
    :param data:被加密字符串(明文)
    :return:密文
    """
    key = key.encode('utf-8')
    # 字符串补位
    data = pad(data)
    cipher = AES.new(key, AES.MODE_ECB)
    # 加密后得到的是bytes类型的数据,使用Base64进行编码,返回byte字符串
    result = cipher.encrypt(data.encode())
    encodestrs = base64.b64encode(result)
    enctext = encodestrs.decode('utf-8')
    print(enctext)
    return enctext

def aesDecrypt(key, data):
    """

    :param key: 密钥
    :param data: 加密后的数据(密文)
    :return:明文
    """
    data = base64.b64decode(data)
    cipher = AES.new(key.encode('utf-8'), AES.MODE_ECB)

    # 去补位
    text_decrypted = unpad(cipher.decrypt(data))
    text_decrypted = text_decrypted.decode('utf-8')
    print(text_decrypted)
    return text_decrypted


if __name__ == '__main__':
    key = '20211222cphjklge'  # 密钥字节长度为16

    data = 'hello world'

    ecdata = aesEncrypt(key, data)
    aesDecrypt(key, ecdata)

输出

0axWDldqSWWyaWA1fvfqxQ==
hello world

非对称加密

简介

公开密钥密码学也称非对称式密码学是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;
公钥用作加密,私钥则用作解密。
使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。
由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。
公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

基于公开密钥加密的特性,它还能提供数字签名的功能,使电子文件可以得到如同在纸本文件上亲笔签署的效果。

公开密钥基础建设透过信任数字证书认证机构的根证书、及其使用公开密钥加密作数字签名核发的公开密钥认证,形成信任链架构,已在TLS实现并在万维网的HTTP以HTTPS、在电子邮件的SMTP以SMTPS或STARTTLS引入。

rsa加密简单举例

了解更多关于rsa加密算法

import rsa

def rsa_encrypt(plaintext):
    '''
    输入明文、生成公钥、私钥
    公钥对明文进行加密、字符串加密
    :return:加密结果及私钥
    '''
    pub_key, priv_key = rsa.newkeys(1024)
    print(pub_key)
    print(priv_key)
    plaintext = plaintext.encode()     #the message to encrypt. Must be a byte string no longer than``k-11`` bytes
    ciphertext = rsa.encrypt(plaintext, pub_key)
    print('加密后:', ciphertext)
    return ciphertext, priv_key

def rsa_decrypt(ciphertext, priv_key):
    '''
    传参私钥和加密的明文
    :param ciphertext:
    :param priv_key:
    :return:解密结果
    '''
    plaintext = rsa.decrypt(ciphertext, priv_key)
    plaintext = plaintext.decode()
    print('解密后:', plaintext)

if __name__ == '__main__':
    plaintext = input("输入明文:\n").strip()
    ciphertext, priv_key = rsa_encrypt(plaintext)
    rsa_decrypt(ciphertext, priv_key)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值