使用rsa公钥和aes数据加密简化socket数据流加密

netcrypt的Python项目详细描述


#netcrypt

<;p>;套接字传输和加密协议<;p>;
<;p>;项目旨在简化套接字加密和常见的服务器/客户端通信任务<;p>;


pip:<;/p>;

````
python3-m pip安装netcrypt
````

项目的当前状态主要处理通过套接字安全地发送数据(包括文件)。要发送的数据首先使用aes加密。然后,aes密钥和init向量使用来自交换套接字连接的公钥集的rsa密码进行加密。然后,数据(消息)创建一个散列验证,用于解密以验证数据的可靠性。
<;br>;
<;br>;
密钥、初始向量、数据验证哈希和数据存储在字典中,以便转储到序列化字节对象中。然后,序列化对象被构造成internet字节顺序,对象的长度存储在传输的前四个字节中。接收时,从检索流长度的流中读取前四个字节,收集流的其余部分,并根据该长度读入。这个过程与此相反。
<;br>;
<;br>;所有套接字数据加密都是在communication.py中完成的,哪些方法使用cryptography.py(基于pycryptodome密码)。

使用加密通信:netcrypt.communication import serverprotocol


```



crypto-traffic=serverprotocol()
```
<;br>;

<;p>;若要开始加密通信,必须交换公钥并存储客户端key:<;/p>;

````
client_public_key=crypto_traffic.public_key_exchange()
````
<;br>;

<;p>;要发送或接收数据,需要先设置公钥。在这种情况下,我们发送:<;/p>;

````
加密流量。设置公共密钥(客户端公共密钥)

message=b'欢迎使用服务器!'
加密流量。发送加密流量(conn,消息)流(conn,消息)
``````
<;br>;

<;p>;接收消息客户端:< lt;p>;
>

````
>`````
>服务器消息=加密流量。接收加密流量(sock)流(sock)
```
<;br>;




>
<;p>;从服务器向客户端发送文件从服务器到客户端发送文件从服务器到客户端


<;p>;p>;发送文件从服务器到客户端:
单位:t在他的案例中,我们将testfile.txt文件存储在cwd中:<;p>;

`````
crypto加密流量发送文件(conn,'testfile.txt')
`````
<;br>;

<;p>;接收上述文件客户端并存储在cwd中:<;p>;

`````
>``````
``````
>```````
<;发送加密流量发送文件(conn,'testfile.txt')
````````````````````````````br>;

<;p>;在enable\u tor()调用时将返回SOCKS套接字。返回的socket对象用于替代典型的socket<;br>;对象并继承其功能。通过TOR网络路由客户端:<;/p>;

```
TOR SOCK=Crypto廑流量。启用廑TOR()
````

<;br>;

\simple server example

```
server byte string和file transmission example

import socket
from netcrypt.communication import serverprotocol


host='localhost'
port=5300
sock=socket.socket(socket.af_inet,socket.sock_stream)
sock.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
sock.bind((host,port))

sock.listen(5)listen on socket
打印('**listening**')
,而1:。#当连接
conn时,addr=sock.accept();接受连接
打印(f'connection!地址:{addr[0]}')
crypto_traffic=server protocol()服务器通信加密协议对象
print('sending/receiving public keys')
client_public_key=加密通信。公钥交换(conn)与客户端交换公钥
加密通信。设置公钥(客户端公钥)
打印("公钥交换")
向客户端发送欢迎消息附加.send_crypto_stream(conn,welcome_message)
response=crypto_traffic.recv_crypto_stream(conn)从客户端接收响应
print(response)

send file to client
crypto_traffic.send_file(conn,'testfile.txt')
print(r'file served廑_/\_')
conn.close()

```

t'
port=5300
sock=socket.socket(socket.af_inet,socket.sock_stream)
sock.setsockopt(socket.sol_socket,socket.so_reuseaddr,1)
crypto_traffic=client protocol();客户端通信加密协议对象

返回套接字对象。必须安装TOR,否则使用上面的套接字对象"sock"代替下面的TOR sock用于使用服务器进行加密的BLIC密钥
打印(f'接收的服务器公钥:'{server pubic'}\n')
加密流量。设置公共密钥(服务器公钥)


server'=crypto'.recv'-crypto'-stream(tor'-sock)''receive hello from server
print(server'-hello.decode())
crypto'-traffic.send_crypto_stream(Tor_sock,b'感谢您邀请我')send response to server
print('sent response')

从服务器接收加密文件流并写入磁盘
crypto_traffic.recv_file(Tor_sock)
print('file received and write to disk!')


````






`
《入门入门


<;p>;创建Cryptoprotocol的实例:<;p>;


``>````

`

``

`````

























<;p>生成随机密钥:<;p>;

>
````
>aes-key=crypto-worker.generate-key(32)
init-vect=crypto-worker.generate-key(16)
```
>
<;br>;
>






<;p>;用aes密码加密数据:<;p>;
>
`````
data='你好,世界'
>aes-key==aes-key==br/>加密工作者生成_密钥(32)
init\u vect=crypto\u-worker.genreate\u-key(16)
enc加密的数据加密(aes\u-key,init\u-vect,数据)
```
>

<;br>;




>
<;p>;用aes密码解密数据:<;p>;
>
`>```
>解密的数据解密(aes\u-key,init)worker.decryp解密(aes\u-key,init\u-密匙,init.U vect,加密的
````>br/>

<;br>;



<;p>;创建rsa私钥并返回公钥:<;p>;


````
>我的公开密钥=密码工人。启动rsa(4096)
```

>





<;p>;使用rsa公钥加密aes加密密钥:<;p>;









br/>```
加密_ AES密钥=加密工作密钥.RSA密钥加密(我的公钥密钥,AES密钥)算法。RSA密钥加密(我的公钥密钥,AES密钥)算法
````


<;br>;


>
<;p>;使用RSA私钥解密AES加密密钥:<;p>;

>
``````
>
`````````
>
<;br>;

>
````````>
>
>>
;lt;br>;
测试密码从netcrypt运行

```
。密码导入密码协议




data='你好,世界!#要加密的某些数据
打印(f"起始数据:{data}')
加密工作者=加密协议();调用加密对象

ed_data=crypto_worker.aes_encrypt(aes_key,init_vector,data)加密数据
打印(f'aes key:{aes_key}\n初始化向量:{init_vector}\n加密数据:{encrypted_data}')

解密数据=crypto_worker.aes_解密(aes_key,init_vector,encrypted_data)解密数据
print(f'解密数据:{解密数据}')



rsa测试

打印(f'starting data:{data}')
crypto廑worker=cryptoprotocol();调用加密对象
my廑public廑u key=crypto廑u worker.start廑rsa(4096)廑生成rsa私钥/公钥

生成aes的随机加密密钥
aes廑u key=crypto廑u worker.generate廑key(32)
init_vector=crypto_worker.generate_key(16)


encrypted_data=crypto_worker.aes_encrypt(aes_key,init_vector,data)encrypt data with encryption key

_worker.rsa_encrypt(my_public_key,aes_key)
encrypted_init_vector=crypto_worker.rsa_encrypt(my_public_key,init_vector)
此时,加密密钥、向量和数据准备好通过套接字发送dict
打印(f'encrypted aes key:{encrypted_aes_key}\n加密初始化vect或者:{加密的初始向量}\n'
f'加密的数据:{加密的数据}')



ted廑init廑u vector)


数据被解密为明文
解密的廑u data=crypto廑u worker.aes廑u解密(解密的廑es廑u密钥,解密的廑init廑u vector,加密的廑u数据)
打印(解密的数据:{解密的廑u data}')

```

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java组织。openqa。硒。遥远的UnreachableBrowserException如何定义EXE路径?   java Camel AdviceWith不使用指定文件替换端点   基于字符串的java图像加载   Java中的启发式算法,计算8个谜题状态的线性冲突   java为什么不支持文件。probeContentType返回null   JPA@EntityListeners、@PrePersist和Spring@RepositoryEventHandler、@HandleBeforeSave之间的java差异   可能前缀的Java字符串到字符串[]   安装rJava | Makefile时发生java错误。全部:38:target’libjri的配方。所以他失败了   Java公共静态void main()   java如何覆盖txt文件中的某些单词   java如何获得循环中生成的字符值之和?   java Log4j创建另一个具有相同属性的appender   java如何在从Axis2 Web服务客户端通过代理服务器调用Web服务时设置代理设置?   在Windows上安装Elasticsearch时发生java错误   java如何向EditText组件添加TextChangedListener?