python常用加密算法

加密算法分类:
1-哈希算法
2-对称加密算法
3-非对称加密算法
4-Base64编码

python中常用的数据加密算法:
1-MD5加密算法(哈希)
2-SHA256加密算法(哈希)
3-Base64编码
4-RSA加密算法(非对称加密)

由于加密算法的特点不同,所以使用的场合也不同。
1-用户登录,一般采用MD5算法、RSA算法
2-数据完整性校验,一般采用MD5算法
3-Token,一般采用Base64编码

MD5加密

import hashlib
def get_md5(obj):
    # 实例化加密对象
    md5=hashlib.md5()
    # 进行加密操作
    md5.update(obj.encode('utf-8'))
    # 返回加密后的结果
    return md5.hexdigest()
print(get_md5('111111'))
# 96e79218965eb72c92a549dd5a330112

SHA256加密

import hashlib
def get_sha256(obj):
    # 1-1实例化加密对象
    sha256=hashlib.sha256()
    # 1-2进行加密
    sha256.update(obj.encode('utf-8'))
    # 1-3返回加密后的结果
    return sha256.hexdigest()
print(get_sha256('111111'))
#bcb15f821479b4d5772bd0ca866c00ad5f926e3580720659cc80d39c9d09802a

Base64编码

import base64
def get_base64(obj):
    #1-1 编码
    Base64=base64.b64encode(obj.encode('utf-8'))
    print('编码后的结果为:',Base64)
    #1-2 解码
    bstr=base64.b64decode(Base64)
    print('解码后的字节码:',bstr)
    print('解码后:',bstr.decode('utf-8'))
get_base64('111111')
# 编码后的结果为: b'MTExMTEx'
# 解码后的字节码: b'111111'
# 解码后: 111111

RSA加密

import rsa
def get_rsa(obj):
    #1-1 实例化加密对象
    (pubkey,privkey)=rsa.newkeys(1024)
    #1-2 公钥加密1
    pwd1=rsa.encrypt(str.encode('utf-8'),pubkey)
    print('加密后结果1为:',pwd1.hex())
    #1-3 私钥解密1
    depwd1=rsa.decrypt(pwd1,privkey)
    print('解密后的结果1为:',depwd1.decode())
get_rsa('111111')
# 加密后结果1为: 5be88fe6e17fd4286eec97f6ac528682b8a709a359c16545c0a1c692480c74471175241a4f3396792621930d773628b4443fcb790470d92fbb4511d51e5621ca737473d0c8d91c58276370f46103fdcfd2adefb697a60b0ed10ca68e0b015ad7f9584e3067ecd40cd3009d6d6bf5b98873880f12a88244e09f707a00b9e47f53
# 解密后的结果1为: utf-8
  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的示例程序,实现了椭圆曲线加密算法加密和解密操作。该程序使用了GMP库进行大数运算,需要先安装GMP库才能编译运行。 ```c #include <stdio.h> #include <stdlib.h> #include <gmp.h> #define MAX_DIGITS 1000 // 大数的最大位数 // 椭圆曲线参数 const char *p_str = "115792089237316195423570985008687907853269984665640564039457584007908834671663"; const char *a_str = "0"; const char *b_str = "7"; const char *gx_str = "55066263022277343669578718895168534326250603453777594175500187360389116729240"; const char *gy_str = "32670510020758816978083085130507043184471273380659243275938904335757337482424"; const char *n_str = "115792089237316195423570985008687907852837564279074904382605163141518161494337"; mpz_t p, a, b, gx, gy, n; // 椭圆曲线参数 // 初始化椭圆曲线参数 void init_curve_params() { mpz_init_set_str(p, p_str, 10); mpz_init_set_str(a, a_str, 10); mpz_init_set_str(b, b_str, 10); mpz_init_set_str(gx, gx_str, 10); mpz_init_set_str(gy, gy_str, 10); mpz_init_set_str(n, n_str, 10); } // 生成随机数 void gen_random(mpz_t r, mpz_t max) { mpz_t rand_num; gmp_randstate_t state; gmp_randinit_default(state); mpz_init(rand_num); mpz_urandomm(rand_num, state, max); mpz_set(r, rand_num); mpz_clear(rand_num); gmp_randclear(state); } // 大数加法 void mpz_add_mod(mpz_t res, mpz_t a, mpz_t b, mpz_t mod) { mpz_t sum; mpz_init(sum); mpz_add(sum, a, b); mpz_mod(res, sum, mod); mpz_clear(sum); } // 大数减法 void mpz_sub_mod(mpz_t res, mpz_t a, mpz_t b, mpz_t mod) { mpz_t diff; mpz_init(diff); mpz_sub(diff, a, b); mpz_mod(res, diff, mod); mpz_clear(diff); } // 大数乘法 void mpz_mul_mod(mpz_t res, mpz_t a, mpz_t b, mpz_t mod) { mpz_t product; mpz_init(product); mpz_mul(product, a, b); mpz_mod(res, product, mod); mpz_clear(product); } // 大数幂运算 void mpz_pow_mod(mpz_t res, mpz_t base, mpz_t exp, mpz_t mod) { mpz_t result, tmp; mpz_init_set_ui(result, 1); mpz_init(tmp); while (mpz_cmp_ui(exp, 0) > 0) { if (mpz_odd_p(exp)) { mpz_mul_mod(result, result, base, mod); } mpz_fdiv_q_2exp(exp, exp, 1); mpz_mul_mod(tmp, base, base, mod); mpz_set(base, tmp); } mpz_set(res, result); mpz_clear(result); mpz_clear(tmp); } // 计算椭圆曲线上的点 void ecc_point(mpz_t x3, mpz_t y3, mpz_t x1, mpz_t y1, mpz_t x2, mpz_t y2) { mpz_t slope, tmp1, tmp2; mpz_init(slope); mpz_init(tmp1); mpz_init(tmp2); if (mpz_cmp(x1, x2) == 0 && mpz_cmp(y1, y2) == 0) { // P + P mpz_mul(tmp1, x1, x1); mpz_mul_ui(tmp2, tmp1, 3); mpz_add(tmp2, tmp2, a); mpz_mul_ui(tmp1, y1, 2); mpz_invert(tmp1, tmp1, p); mpz_mul(slope, tmp1, tmp2); } else { // P + Q mpz_sub(tmp1, y2, y1); mpz_sub(tmp2, x2, x1); mpz_invert(tmp2, tmp2, p); mpz_mul(slope, tmp1, tmp2); } // 计算新点的坐标 mpz_mul(tmp1, slope, slope); mpz_sub(tmp1, tmp1, x1); mpz_sub(tmp1, tmp1, x2); mpz_mod(x3, tmp1, p); mpz_sub(tmp1, x1, x3); mpz_mul(tmp1, tmp1, slope); mpz_sub(tmp1, tmp1, y1); mpz_mod(y3, tmp1, p); mpz_clear(slope); mpz_clear(tmp1); mpz_clear(tmp2); } // 椭圆曲线点加密 void ecc_encrypt(mpz_t x, mpz_t y, mpz_t k, mpz_t m) { mpz_t px, py, kx, ky, rx, ry; mpz_init(px); mpz_init(py); mpz_init(kx); mpz_init(ky); mpz_init(rx); mpz_init(ry); // 生成随机数k gen_random(k, n); // 计算kG mpz_set(kx, gx); mpz_set(ky, gy); for (int i = mpz_sizeinbase(k, 2) - 2; i >= 0; i--) { ecc_point(rx, ry, kx, ky, kx, ky); if (mpz_tstbit(k, i)) { ecc_point(kx, ky, rx, ry, gx, gy); } else { mpz_set(kx, rx); mpz_set(ky, ry); } } // 计算mP mpz_set(px, x); mpz_set(py, y); for (int i = mpz_sizeinbase(k, 2) - 2; i >= 0; i--) { ecc_point(rx, ry, px, py, px, py); if (mpz_tstbit(k, i)) { ecc_point(px, py, rx, ry, x, y); } else { mpz_set(px, rx); mpz_set(py, ry); } } // 将加密结果输出到控制台 gmp_printf("Encrypted value: (%Zd, %Zd)\n", px, py); mpz_clear(px); mpz_clear(py); mpz_clear(kx); mpz_clear(ky); mpz_clear(rx); mpz_clear(ry); } // 椭圆曲线点解密 void ecc_decrypt(mpz_t x, mpz_t y, mpz_t d, mpz_t px, mpz_t py) { mpz_t kx, ky, rx, ry; mpz_init(kx); mpz_init(ky); mpz_init(rx); mpz_init(ry); // 计算dP mpz_set(kx, px); mpz_set(ky, py); for (int i = mpz_sizeinbase(d, 2) - 2; i >= 0; i--) { ecc_point(rx, ry, kx, ky, kx, ky); if (mpz_tstbit(d, i)) { ecc_point(kx, ky, rx, ry, px, py); } else { mpz_set(kx, rx); mpz_set(ky, ry); } } // 将解密结果输出到控制台 gmp_printf("Decrypted value: (%Zd, %Zd)\n", kx, ky); mpz_clear(kx); mpz_clear(ky); mpz_clear(rx); mpz_clear(ry); } int main() { mpz_t k, m, px, py, d; mpz_init(k); mpz_init(m); mpz_init(px); mpz_init(py); mpz_init(d); // 初始化椭圆曲线参数 init_curve_params(); // 加密明文 mpz_set_str(m, "1234567890", 10); // 明文为1234567890 ecc_encrypt(px, py, k, m); // 解密密文 mpz_set_str(d, "1234567890123456789012345678901234567890", 10); // 私钥为1234567890123456789012345678901234567890 ecc_decrypt(gx, gy, d, px, py); mpz_clear(k); mpz_clear(m); mpz_clear(px); mpz_clear(py); mpz_clear(d); return 0; } ``` 需要注意的是,该程序只是一个简单的示例,没有进行任何异常处理和错误检查,实际使用时需要仔细考虑各种边界情况。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值