「青锋爱分享」Springboot+Python之RSA加解密方案(RSA深入)二

Python09

「青锋爱分享」Springboot+Python之RSA加解密方案(RSA深入)二,第1张

本篇文章要结合上一节文章一起看。

青锋爱分享-RSA-Springboot+Python整合

码云搜索: 青锋 会有惊喜哦哦。

通过python生成的公钥私钥 格式PKCS1 。

生成pem格式如下:

私钥头(-----BEGIN RSA PRIVATE KEY-----)

私钥尾(-----END RSA PRIVATE KEY-----)

我需要将此私钥转换为DER编码的PKCS8未加密格式,以便与java服务器代码一起使用,特别是PKCS8EncodedKeySpec。我已经试过使用rsa和pkcs8命令的OpenSSL,如果有更简单的办法,没有特别需要使用openssl。

RSA私钥格式PKCS1和PKCS8相互转换

RSA公钥格式PKCS1和PKCS8相互转换

以下转换基于openssl命令的操作;

执行:openssl genrsa -out private.pem 1024

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5+Kosybacfp8hzjn1fl2wT7Au2lm5SEtz6r+/wwSfq5KfY

H8q1AO/C92IwEpplNbrqYmOXQu6P07mg0lQOCvE5sdtmAvD2ex3wCef8lWmgdh5q

Uo4OMcmoSz3IAp/7/FnMag1IelSfdronPBDxazp6NUmQZITsYK6CsEl/ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+Yxy6jsMu3ynwMwbhcVmCWCmZoWuE5pZdEJk6

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+Kc3lmE4zYBGAb2IYx48UEN34nP5rI8Tusqsy7CZ3rvSMi1CpVlj2eQK

FU8FzVFyjwJBAO6PU9q7il8NtecdvYBkDErlCawSeCdk9s79helT0Mrg9cWaVWFO

n0UxgT55MPXWGdMRXUUOCNnMilaw/p7dKlUCQDpjGeu3GivmB2dDN0ad2nUIBftu

s3SeWoB5RdL6T6liiyi5DfJ4uV9kVKe7Epy9jIabFjJ5SWpmaDps21zGVGMCQQCB

HvK0IW3zpOgf/+jh5UUCBJYHnLeMGwm7X11rvQH1zW05Vx9/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+JWgWLdWceXX9Puu4KNmGukx4GZw2n53vMKp0Fu

puQxMonRWTN+kA76cq8QIj8xuEBkdxy1NFRMEkGu675m

-----END RSA PRIVATE KEY-----

执行:openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem

-----BEGIN PRIVATE KEY-----

MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAOUubn4qizJtpx+n

yHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA78L3YjASmmU1uupiY5dC7o/T

uaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4xyahLPcgCn/v8WcxqDUh6VJ92

uic8EPFrOno1SZBkhOxgroKwSX97AgMBAAECgYEAmQx28X6L0rNzpiowLSt9Andm

z68U62xuZBUAydDwlYEInU7x39zrTBFCDJuUULI7tVc6aggmpf8mvZoRHxsW0b5j

HLqOwy7fKfAzBuFxWYJYKZmha4Tmll0QmTqU505rLtOQTjlf9Zzsr2Jmza64HuzK

Ui8r8dXHGK3oUZ49rhECQQD175WgBvEG/vwfLFFxK1b4pzeWYTjNgEYBvYhjHjxQ

Q3fic/msjxO6yqzLsJneu9IyLUKlWWPZ5AoVTwXNUXKPAkEA7o9T2ruKXw215x29

gGQMSuUJrBJ4J2T2zv2F6VPQyuD1xZpVYU6fRTGBPnkw9dYZ0xFdRQ4I2cyKVrD+

nt0qVQJAOmMZ67caK+YHZ0M3Rp3adQgF+26zdJ5agHlF0vpPqWKLKLkN8ni5X2RU

p7sSnL2MhpsWMnlJamZoOmzbXMZUYwJBAIEe8rQhbfOk6B//6OHlRQIElgect4wb

CbtfXWu9AfXNbTlXH39bnrlE4j9+ORHWoIOtkl4eCoxYOUhS5H34F0ECQAjz4laB

Yt1Zx5df0+67go2Ya6THgZnDafne8wqnQW6m5DEyidFZM36QDvpyrxAiPzG4QGR3

HLU0VEwSQa7rvmY=

-----END PRIVATE KEY-----

执行:openssl rsa -in pkcs8.pem -out pkcs1.pem

-----BEGIN RSA PRIVATE KEY-----

MIICXQIBAAKBgQDlLm5+Kosybacfp8hzjn1fl2wT7Au2lm5SEtz6r+/wwSfq5KfY

H8q1AO/C92IwEpplNbrqYmOXQu6P07mg0lQOCvE5sdtmAvD2ex3wCef8lWmgdh5q

Uo4OMcmoSz3IAp/7/FnMag1IelSfdronPBDxazp6NUmQZITsYK6CsEl/ewIDAQAB

AoGBAJkMdvF+i9Kzc6YqMC0rfQJ3Zs+vFOtsbmQVAMnQ8JWBCJ1O8d/c60wRQgyb

lFCyO7VXOmoIJqX/Jr2aER8bFtG+Yxy6jsMu3ynwMwbhcVmCWCmZoWuE5pZdEJk6

lOdOay7TkE45X/Wc7K9iZs2uuB7sylIvK/HVxxit6FGePa4RAkEA9e+VoAbxBv78

HyxRcStW+Kc3lmE4zYBGAb2IYx48UEN34nP5rI8Tusqsy7CZ3rvSMi1CpVlj2eQK

FU8FzVFyjwJBAO6PU9q7il8NtecdvYBkDErlCawSeCdk9s79helT0Mrg9cWaVWFO

n0UxgT55MPXWGdMRXUUOCNnMilaw/p7dKlUCQDpjGeu3GivmB2dDN0ad2nUIBftu

s3SeWoB5RdL6T6liiyi5DfJ4uV9kVKe7Epy9jIabFjJ5SWpmaDps21zGVGMCQQCB

HvK0IW3zpOgf/+jh5UUCBJYHnLeMGwm7X11rvQH1zW05Vx9/W565ROI/fjkR1qCD

rZJeHgqMWDlIUuR9+BdBAkAI8+JWgWLdWceXX9Puu4KNmGukx4GZw2n53vMKp0Fu

puQxMonRWTN+kA76cq8QIj8xuEBkdxy1NFRMEkGu675m

-----END RSA PRIVATE KEY-----

可以看出结果和1是一致的;

执行:openssl rsa -in private.pem -pubout -out public.pem

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlLm5+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/C92IwEpplNbrqYmOXQu6P07mg0lQOCvE5

sdtmAvD2ex3wCef8lWmgdh5qUo4OMcmoSz3IAp/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----

5. 从pkcs8私钥中生成pkcs8公钥

执行:openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlLm5+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/C92IwEpplNbrqYmOXQu6P07mg0lQOCvE5

sdtmAvD2ex3wCef8lWmgdh5qUo4OMcmoSz3IAp/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----

可以看出结果和4是一样的;

执行:openssl rsa -pubin -in public.pem -RSAPublicKey_out

-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/v8WcxqDUh6VJ92uic8EPFrOno1SZBkhOxgroKwSX97AgMBAAE=

-----END RSA PUBLIC KEY-----

openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out

-----BEGIN RSA PUBLIC KEY-----

MIGJAoGBAOUubn4qizJtpx+nyHOOfV+XbBPsC7aWblIS3Pqv7/DBJ+rkp9gfyrUA

78L3YjASmmU1uupiY5dC7o/TuaDSVA4K8Tmx22YC8PZ7HfAJ5/yVaaB2HmpSjg4x

yahLPcgCn/v8WcxqDUh6VJ92uic8EPFrOno1SZBkhOxgroKwSX97AgMBAAE=

-----END RSA PUBLIC KEY-----

可以看出转换的结果是一致的;

执行:openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlLm5+Kosybacfp8hzjn1fl2wT

7Au2lm5SEtz6r+/wwSfq5KfYH8q1AO/C92IwEpplNbrqYmOXQu6P07mg0lQOCvE5

sdtmAvD2ex3wCef8lWmgdh5qUo4OMcmoSz3IAp/7/FnMag1IelSfdronPBDxazp6

NUmQZITsYK6CsEl/ewIDAQAB

-----END PUBLIC KEY-----

可以看到和上面4,5的结果是一致的;

最后一点:

iOS上用的是pkcs8格式的公钥

openssl用的是pkcs1格式的公钥

知道私钥以后是可以导出公钥的,所以私钥一定要保证安全

知道公钥不可以导出私钥

解决方案针对是window电脑。

配置:SystemRoot/ System32 环境变量。

1、邮件我的电脑-选择下【属性】。

2、选择高级系统设置

3、选择【高级】-【环境变量】

4、双击打开path,进行编辑

5、 接着我们在这名字后面加【;System32】就可以了。

安装 Win64 OpenSSL,地址: http://slproweb.com/products/Win32OpenSSL.html

下载后根据提示一步一步安装,安装完成后:

双击start.bat 启动

先是获取验证码样本。。。我存了大概500个。

用dia测了测每个字之间的间距,直接用PIL开始切。

from PIL import Image

for j in range(0,500):

f=Image.open("../test{}.jpg".format(j))

for i in range(0,4):

f.crop((20+20*i,0,40+20*i,40)).save("test{0}-{1}.jpg".format(j,i+1))

上面一段脚本的意思是把jpg切成四个小块然后保存

之后就是二值化啦。

def TotallyShit(im):

x,y=im.size

mmltilist=list()

for i in range(x):

for j in range(y):

if im.getpixel((i,j))<200:

mmltilist.append(1)

else:

mmltilist.append(0)

return mmltilist

咳咳,不要在意函数的名字。上面的一段代码的意思是遍历图片的每个像素点,颜色数值小于200的用1表示,其他的用0表示。

其中的im代表的是Image.open()类型。

切好的图片长这样的。

只能说这样切的图片还是很粗糙,很僵硬。

下面就是分类啦。

把0-9,“+”,”-“的图片挑好并放在不同的文件夹里面,这里就是纯体力活了。

再之后就是模型建立了。

这里我试了自己写的还有sklearn svm和sklearn neural_network。发现最后一个的识别正确率高的多。不知道是不是我样本问题QAQ。

下面是模型建立的代码

from sklearn.neural_network import MLPClassifier

import numpy as np

def clf():

clf=MLPClassifier()

mmltilist=list()

X=list()

for i in range(0,12):

for j in os.listdir("douplings/douplings-{}".format(i)):

mmltilist.append(TotallyShit(Image.open("douplings/douplings-{0}/{1}".format(i,j)).convert("L")))

X.append(i)

clf.fit(mmltilist,X)

return clf

大概的意思是从图片源中读取图片和label然后放到模型中去跑吧。

之后便是图像匹配啦。

def get_captcha(self):

with open("test.jpg","wb") as f:

f.write(self.session.get(self.live_captcha_url).content)

gim=Image.open("test.jpg").convert("L")

recognize_list=list()

for i in range(0,4):

part=TotallyShit(gim.crop((20+20*i,0,40+20*i,40)))

np_part_array=np.array(part).reshape(1,-1)

predict_num=int(self.clf.predict(np_part_array)[0])

if predict_num==11:

recognize_list.append("+")

elif predict_num==10:

recognize_list.append("-")

else:

recognize_list.append(str(predict_num))

return ''.join(recognize_list)

最后eval一下识别出来的字符串就得出结果了。。

顺便提一句现在的bilibili登陆改成rsa加密了,麻蛋,以前的脚本全部作废,心好痛。

登陆的代码。

import time

import requests

import rsa

r=requests.session()

data=r.get("act=getkey&_="+str(int(time.time()*1000))).json()

pub_key=rsa.PublicKey.load_pkcs1_openssl_pem(data['key'])

payload = {

'keep': 1,

'captcha': '',

'userid': "youruserid",

'pwd': b64encode(rsa.encrypt((data['hash'] +"yourpassword").encode(), pub_key)).decode(),

}

r.post("",data=payload)

搜索本产品内容

查询

文档中心 >消息队列 CKafka >SDK 文档 >Python SDK >公网 SASL_SSL 方式接入

公网 SASL_SSL 方式接入

最近更新时间:2021-12-28 09:54:00

操作场景

前提条件

操作步骤

步骤1:准备工作

步骤2:生产消息

步骤3:消费消息

操作场景

该任务以 Python 客户端为例,指导您使用公网 SASL_SSL 方式接入消息队列 CKafka 并收发消息。

前提条件

安装 Python

安装 pip

配置 ACL 策略

下载 Demo

下载 SASL_SSL 证书

操作步骤

步骤1:准备工作

创建接入点。

实例列表 页面,单击目标实例 ID,进入实例详情页。

在 基本信息 >接入方式 中,单击添加路由策略,在打开窗口中选择:路由类型:公网域名接入,接入方式:SASL_SSL。



创建角色。

在用户管理页面新建角色,设置密码。



创建 Topic。

控制台 topic 管理页面新建 Topic(参见 创建 Topic)。

添加 Python 依赖库。

执行以下命令安装:

pip install kafka-python

步骤2:生产消息

修改生产消息程序 producer.py 中配置参数。

producer = KafkaProducer(

bootstrap_servers = ['xx.xx.xx.xx:port'],

api_version = (1, 1),

#

# SASL_SSL 公网接入

#

security_protocol = "SASL_SSL",

sasl_mechanism = "PLAIN",

sasl_plain_username = "instanceId#username",

sasl_plain_password = "password",

ssl_cafile = "CARoot.pem",

ssl_check_hostname = False,

)

message = "Hello World! Hello Ckafka!"

msg = json.dumps(message).encode()

producer.send('topic_name', value = msg)

print("produce message " + message + " success.")

producer.close()

参数

描述

bootstrap_servers

接入网络,在控制台的实例详情页面接入方式模块的网络列复制。



sasl_plain_username

用户名,格式为 实例 ID + # + 用户名。实例 ID 在 CKafka 控制台 的实例详情页面的基本信息获取,用户在用户管理创建用户时设置。

sasl_plain_password

用户密码,在 CKafka 控制台实例详情页面的用户管理创建用户时设置。

topic_name

Topic 名称,您可以在控制台上 topic管理页面复制。



CARoot.pem

采用 SASL_SSL 方式接入时,所需的证书路径。

编译并运行 producer.py。

查看运行结果。



在 CKafka 控制台 的 topic管理页面,选择对应的 Topic , 单击更多 >消息查询,查看刚刚发送的消息。



步骤3:消费消息

修改消费消息程序 consumer.py 中配置参数。

consumer = KafkaConsumer(

'topic_name',

group_id = "group_id",

bootstrap_servers = ['xx.xx.xx.xx:port'],

api_version = (1,1),

#

# SASL_SSL 公网接入

#

security_protocol = "SASL_SSL",

sasl_mechanism = 'PLAIN',

sasl_plain_username = "instanceId#username",

sasl_plain_password = "password",

ssl_cafile = "CARoot.pem",

ssl_check_hostname = False,

)

for message in consumer:

print ("Topic:[%s] Partition:[%d] Offset:[%d] Value:[%s]" %

(message.topic, message.partition, message.offset, message.value))

参数

描述

bootstrap_servers

接入网络,在控制台的实例详情页面接入方式模块的网络列复制。



group_id

消费者的组 ID,根据业务需求自定义。

sasl_plain_username

用户名,格式为 实例 ID + # + 用户名。实例 ID 在CKafka 控制台的实例详情页面的基本信息获取,用户在用户管理创建用户时设置。

sasl_plain_password

用户名密码,在 CKafka 控制台实例详情页面的用户管理创建用户时设置

topic_name

Topic 名称,您可以在控制台上 topic管理页面复制。



CARoot.pem

采用 SASL_SSL 方式接入时,所需的证书路径。

编译并运行 consumer.py。

查看运行结果。



在 CKafka 控制台 的 Consumer Group 页面,选择对应的消费组名称,在主题名称输入 Topic 名称,单击查询详情,查看消费详情。



上一篇: 公网 SASL_PLAINTEXT 方式接入下一篇: VPC 网络接入

文档内容是否对您有帮助?

有帮助没帮助

如果遇到产品相关问题,您可咨询 在线客服 寻求帮助。

消息队列 CKafka 相关文档

API 概览

创建主题

签名方法

获取实例列表

删除主题白名单

增加主题白名单

错误返回结果

产品概述

获取主题属性

点击搜索腾讯云文档

取消

清除查询