简易密码机开发记录
23125366 翟杰城
一、本地Demo开发
我使用的电脑是Mac BookPro,现在本地进行了一个小Demo的开发,先制作原型,在进行树莓派的部署
(一)环境搭建
1、使用homebrew安装openssl3.0
brew install openssl@3.0
2、配置环境变量
在~/.zshrc
中添加
export PATH="/opt/homebrew/opt/openssl@3.0/bin:$PATH"
export LDFLAGS="-L/opt/homebrew/opt/openssl@3.0/lib"
export CPPFLAGS="-I/opt/homebrew/opt/openssl@3.0/include"
使用source ~/.zshrc
使其生效
输入openssl version
检查是否生效,如显示:
OpenSSL 3.0.12 24 Oct 2023 (Library: OpenSSL 3.0.12 24 Oct 2023)
则配置成功
(二)CLion配置
在CMakeLists.txt中添加
target_link_libraries(CipherMachine PRIVATE ssl crypto)
include_directories(/opt/homebrew/opt/openssl@3.0/include)
link_directories(/opt/homebrew/opt/openssl@3.0/lib)
然后重新加载本项目即可生效
(三)编译动态链接库文件
本次密码机的实现方式如下:
基础密码算法:使用C语言和OpenSSL库函数实现
后端数据交互:使用Python和Django框架实现
故不可避免需要实现多语言间的调用,这里采用的方法是动态链接库
对写好的C语言程序,执行下面的命令:
gcc -shared -fPIC -o main.dylib main.c -I/opt/homebrew/opt/openssl@3.0/include -L/opt/homebrew/opt/openssl@3.0/lib -lssl -lcrypto
其中,
-I/opt/homebrew/opt/openssl@3.0/include -L/opt/homebrew/opt/openssl@3.0/lib
是指定的OpenSSL的安装路径,需要定位到include文件夹和lib文件夹,但是也有一个说法是,如果你的安装路径是默认的系统路径的话,就不需要指定了,没有仔细研究,但是我这里不指定就会报找不到文件错误,无法编译
另外,这里我使用Mac系统,故编译成.dylib格式的,如果是在Linux系统上,请编译为.so文件结尾
编译完成后,就可以使用Python 的 ctypes调用了,这里举一个简单的例子:
C语言程序:
#include <stdio.h>
#include <openssl/md5.h>
void md5(unsigned char data[]){
unsigned char out[1024] = {0};
int len = sizeof(data);
MD5(data, len, out);
for(int i=0; i<16; i++){
printf("%x", out[i]);
}
}
编译后产生:main.dylib
Python调用:
import ctypes
# 加载动态链接库
lib = ctypes.CDLL("./main.dylib") # 替换成实际的库文件名和路径
# 定义C函数的参数类型
lib.md5.argtypes = [ctypes.POINTER(ctypes.c_char)]
# 定义C函数的返回类型
lib.md5.restype = None
def call_md5(data):
# 调用C函数
lib.md5(data)
# 测试
data = b"Hello, World!"
call_md5(data)
(四)Python 后端 Django API 启动
本项目后端采用Django框架,使用Restful FrameWork 风格的API构建。仅使用较为简单的API接口实现,下面给出后端的搭建过程:
1、请先安装必要的环境:
Django == 4.1
djangorestframework == 3.14.0
2、启动本项目:
在终端中将python环境切换到包含Django库的环境中,并进入本项目文件夹,执行:
python3 manage.py runserver 0.0.0.0:8000
即可启动本项目,后在浏览器中输入,以md5接口举例:
127.0.0.1:8000/api/md5
即可访问本接口,在content
中输入:
{
"plaintext":"helloworld"
}
单击Post
即可得到经md5加密后的字符串
后续会给出所有实现的API接口调用文档。
{
"plaintext":"helloworld",
"public_key":"MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABHZ0h3h9m0M4QrRtaB/8xIkWfSye\nt/VPT1fXKB+8IhiUaCbS7t/MRvtdHmbI/54AVxLgWv4QoqR4KilElNWzd98="
}
{
"ciphertext":"MHMCIFAYz5wUXdfojvBJ4tEzoYscK2gVYY1OHflyA9GZDOTYAiEAoqlow65IejONW0vn193vSL07gaBD+sbeiH90V0ncXsMEIDe9X39UBCpJoUeVSudWYjJXR5UnNqv7uUwLCKzaUqGGBAo3epm+iGyhKsRE",
"private_key":"MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEIEgPH4iKwh9MxNka\no6RkIgb4TWofYojigh5motRTr2CSoUQDQgAEdnSHeH2bQzhCtG1oH/zEiRZ9LJ63\n9U9PV9coH7wiGJRoJtLu38xG+10eZsj/ngBXEuBa/hCipHgqKUSU1bN33w=="
}
{
"data":"helloworld",
"private_key":"MIGIAgEAMBQGCCqBHM9VAYItBggqgRzPVQGCLQRtMGsCAQEEIEgPH4iKwh9MxNka\no6RkIgb4TWofYojigh5motRTr2CSoUQDQgAEdnSHeH2bQzhCtG1oH/zEiRZ9LJ63\n9U9PV9coH7wiGJRoJtLu38xG+10eZsj/ngBXEuBa/hCipHgqKUSU1bN33w=="
}
{
"data":"helloworld",
"signature":"MEUCIQDzaBdyqL2VQ14WMRMVeRmAlNrB9Ff0XFEfOd9k7dLFgAIgRhmO5W64PU3GRoXpSSc9AZku9sw1lKjmcHrHq3y+5hw=",
"public_key":"MFowFAYIKoEcz1UBgi0GCCqBHM9VAYItA0IABPIlETv9xf3ThFRCe/ulIFbJh8aM\nNeRRq93njNUgyPgHI6xCmRfd5r1m83Ow7NAkYeP0x3kGpIH3lRdXqWTvn3g="
}
附:Linux下编译安装 OpenSSL3.0
仓库地址:https://github.com/openssl/openssl/tree/openssl-3.0
更新apt
sudo apt update
克隆源码
git clone --depth 1 https://github.com/openssl/openssl.git
cd openssl
切换到3.0版本分支
git checkout openssl-3.0
自定义安装路径
./config --prefix=/usr/local/ssl --openssldir=/usr/local/ssl
编译安装
make
sudo make install
sudo ldconfig /usr/local/ssl/lib
验证安装
/usr/local/bin/openssl version
修改~/.bashrc文件
export PATH=/usr/local/ssl/bin:$PATH
使之生效
source ~/.bashrc
查看是否成功
openssl version