python认证密钥rsa

本文介绍了如何在Python中使用RSA算法生成密钥,并提供了相关代码示例,包括加密、解密以及与配置文件和Postman的结合使用。
摘要由CSDN通过智能技术生成

一、安装及生成密钥

#pip install pycryptodome
#pip install  Crypto

# 在控制台下运行,用以生成加密的公钥和私钥
# openssl genrsa -out ./myPrivateKey.pem -passout pass:"wodeceshi" -des3 2048
# openssl rsa -pubout -in ./myPrivateKey.pem -passin pass:"wodeceshi" -out ./myPublicKey.pem

二、代码

1、rsa2048.py

加密文字或验证文字或解密文字,都是bytes对象,因此str字符串要encode,居然能支持中文字符串,空字符串也可以

from Crypto.PublicKey import RSA
from Crypto.Hash import SHA
from Crypto.Signature import PKCS1_v1_5 as PKCS1_v1_5_sign
from Crypto.Cipher import PKCS1_v1_5 as PKCS1_v1_5_cipher
from base64 import b64encode, b64decode

#pip install pycryptodome
#pip install  Crypto

# 在控制台下运行,用以生成加密的公钥和私钥
# openssl genrsa -out ./myPrivateKey.pem -passout pass:"wodeceshi" -des3 2048
# openssl rsa -pubout -in ./myPrivateKey.pem -passin pass:"wodeceshi" -out ./myPublicKey.pem



# 加密文字或验证文字或解密文字,都是bytes对象,因此str字符串要encode,居然能支持中文字符串,空字符串也可以
sss = '好好学习'
msg = sss.encode('utf-8')
# print(msg)
# 验证签名
def rsa_sign(message):
    try:
        private_key_file = open('./myPrivateKey.pem', 'r')
        private_key = RSA.importKey(private_key_file.read(), 'wodeceshi')
        hash_obj = SHA.new(message)
        signer = PKCS1_v1_5_sign.new(private_key)
        d = b64encode(signer.sign(hash_obj))
        return d
    except Exception as e:
        print(e)
        return None

def rsa_verify(message, signature):
    try:
        public_key_file = open('./myPublicKey.pem', 'r')
        public_key = RSA.importKey(public_key_file.read())
        sign = b64decode(signature)
        h = SHA.new(message)
        verifier = PKCS1_v1_5_sign.new(public_key)
        # 单独增加一项长度验证,因为经测试,编码后的字符串长度变长,验证也能通过,因此加长度验证
        if len(signature) != 344:
            return False

        return verifier.verify(h, sign)
    except Exception as e:
        print(e)
        return False

s = rsa_sign(msg)
print(s)
print(msg)
v = rsa_verify(msg, s)
print(v)


# # 文字的加密与解密
# def rsa_encrypt(message):
#     try:
#         public_key_file = open('./myPublicKey.pem', 'r')
#         public_key = RSA.importKey(public_key_file.read())
#         signer = PKCS1_v1_5_cipher.new(public_key)
#         rsa_text = b64encode(signer.encrypt(message))
#         return rsa_text
#     except Exception as e:
#         print(e)
#         return None
#
#
# def rsa_decrypt(message):
#     try:
#         private_key_file = open('./myPrivateKey.pem', 'r')
#         private_key = RSA.importKey(private_key_file.read(), 'wodeceshi')
#         signer = PKCS1_v1_5_cipher.new(private_key)
#         back_text = signer.decrypt(b64decode(message), 0)
#         return back_text.decode('utf-8')
#     except Exception as e:
#         print(e)
#         return None
#
# v = rsa_encrypt(msg)
# print(v)
# k = rsa_decrypt(v)
# print(k)

2、mygetConfig.py

import configparser


def get_config(config_file='zyconfig.ini'):
    parser = configparser.ConfigParser()
    parser.read(config_file,encoding='UTF-8')
    

    _conf_security = [(key, str(value)) for key, value in parser.items('security')]

    return dict(_conf_security )

3、zyconfig.ini

[security]
uobjct=好好学习
ukulng=天天向上

4、test.py

from flask import Flask, request
from flask_httpauth import HTTPBasicAuth
from flask import abort, jsonify
auth = HTTPBasicAuth(scheme='Token', realm="AI Object Detection")
import mygetConfig
gConfig = {}
gConfig = mygetConfig.get_config()
app = Flask(__name__)
import base64,cv2
import numpy as np
def image_to_base64(full_path):
    with open(full_path, "rb") as f:
        data = f.read()
        image_base64_enc = base64.b64encode(data)
        image_base64_enc = str(image_base64_enc, 'utf-8')
    return image_base64_enc

def base64_to_image(base64_code):
    img_data = base64.b64decode(base64_code)
    img_array = np.fromstring(img_data, np.uint8)
    image_base64_dec = cv2.imdecode(img_array, cv2.COLOR_RGB2BGR)
    return image_base64_dec
def cv2_base64(image):
    base64_str = cv2.imencode('.jpg',image)[1].tostring()
    base64_str = base64.b64encode(base64_str)
    return base64_str

@app.route('/trash1', methods=['GET', 'POST'],strict_slashes=False)
@auth.login_required
def tt():
    img_bytes = request.json["img_stream"]
    img = base64_to_image(img_bytes)
    img_bytes = cv2_base64(img)
    img_bytes = img_bytes.decode()
    return img_bytes

@auth.verify_password
#验证密码:username,password 在config_docker.ini [security]中配置
def verify_password(username_or_token, password):

    # 进行rsa2048验证
    from rsa2048 import rsa_verify
    #函数rsa_sign为加密,rsa_verify为校验
    # print(gConfig['uobjct'].encode('utf-8'))
    # print(gConfig['ukulng'].encode('utf-8'))
    # print(username_or_token)
    # print(password)
    if rsa_verify(gConfig['uobjct'].encode('utf-8'), username_or_token) and rsa_verify(
            gConfig['ukulng'].encode('utf-8'), password):
        # print("rsa_verify: ok")
        pass
    else:
        # return jsonify({"Result": "FAIL", "ErrorMsg": "Unauthorized Access", "Details": {}})
        abort(401)

    return True
if __name__ == '__main__':
    app.run("0.0.0.0",port=10099)

5、postman

在这里插入图片描述

在这里插入图片描述

6、ceshi.py

import requests
import json

url = "http://192.168.1.7:10099/trash1"

payload = json.dumps({
  "img_stream": ""
})
headers = {
  'Authorization': 'Basic c1FBWXNHK2EvSk1BUUNNZ0dpLzFvUzFtWGtRNTJ5TzN2ZUcvUHRsT3I1SjE5MzhreFdVc2JzTTh4RWFRaExyZi9oZ2llMktON2x4dkxIYWZtMHlXQVdhZTlyQ2dkdjVKRm41SG8wU1owenpiQSsySjA1Z2tXdXYrdVRyRmlKVU9MRzk2U1VQWldsRk0zbG5veURSaDBYR3owVXkwRW1XTzFHSW9GQ1lUbTB0cjNURnZZZnBsMWsxWGsxdFZVT1loc09MVWdwYit6UTRSR3Nrd0FlYmZ1UnhzK3NWMjVwUlJkM3k4K29pTFpxblJLeVVoTmY5REZBVUhBbzZkTjhhUzN5WUJEVHFnRmYxUExzVGlXdHpWMTZ4QUVVWW9ZMTRUekd1WmRJSHJuS3BGU0FKUjY5aHJXS0xNTm5ld2Z2ZmtiSUoreGhoV09Sc00yZjRSaDJvTFRRPT06c1FBWXNHK2EvSk1BUUNNZ0dpLzFvUzFtWGtRNTJ5TzN2ZUcvUHRsT3I1SjE5MzhreFdVc2JzTTh4RWFRaExyZi9oZ2llMktON2x4dkxIYWZtMHlXQVdhZTlyQ2dkdjVKRm41SG8wU1owenpiQSsySjA1Z2tXdXYrdVRyRmlKVU9MRzk2U1VQWldsRk0zbG5veURSaDBYR3owVXkwRW1XTzFHSW9GQ1lUbTB0cjNURnZZZnBsMWsxWGsxdFZVT1loc09MVWdwYit6UTRSR3Nrd0FlYmZ1UnhzK3NWMjVwUlJkM3k4K29pTFpxblJLeVVoTmY5REZBVUhBbzZkTjhhUzN5WUJEVHFnRmYxUExzVGlXdHpWMTZ4QUVVWW9ZMTRUekd1WmRJSHJuS3BGU0FKUjY5aHJXS0xNTm5ld2Z2ZmtiSUoreGhoV09Sc00yZjRSaDJvTFRRPT0=',
  'Content-Type': 'application/json'
}

response = requests.request("POST", url, headers=headers, data=payload)

print(response.text)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
RSA加密算法是一种非对称加密算法,其密钥由公钥和私钥组成,其中公钥用于加密,私钥用于解密。下面是Python实现RSA密钥生成的代码: ```python import random import math def gcd(a, b): if b == 0: return a else: return gcd(b, a % b) def is_prime(n): if n == 2 or n == 3: return True if n < 2 or n % 2 == 0: return False if n < 9: return True if n % 3 == 0: return False r = int(math.sqrt(n)) f = 5 while f <= r: if n % f == 0: return False if n % (f + 2) == 0: return False f += 6 return True def generate_keypair(p, q): if not (is_prime(p) and is_prime(q)): raise ValueError("Both numbers must be prime.") elif p == q: raise ValueError("p and q cannot be equal") n = p * q phi = (p-1) * (q-1) e = random.randrange(1, phi) g = gcd(e, phi) while g != 1: e = random.randrange(1, phi) g = gcd(e, phi) d = modinv(e, phi) return ((e, n), (d, n)) def modinv(a, m): g, x, y = egcd(a, m) if g != 1: raise ValueError('Modular inverse does not exist') else: return x % m def egcd(a, b): if a == 0: return (b, 0, 1) else: g, y, x = egcd(b % a, a) return (g, x - (b // a) * y, y) p = 61 q = 53 public_key, private_key = generate_keypair(p, q) print("Public key: ", public_key) print("Private key: ", private_key) ``` 在上述代码中,generate_keypair()函数用于生成公钥和私钥,其中p和q为两个质数,n为p和q的乘积,phi为(p-1) * (q-1),e为一个介于1和phi之间的随机数,d为e的模phi的逆元。 egcd()函数用于求解模逆元,is_prime()函数用于判断一个数是否为质数,gcd()函数用于求解两个数的最大公约数。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wa1tzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值