Administrator
发布于 2024-04-15 / 13 阅读
0
0

1

简易密码机开发记录

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


评论