Delphi 的 RSA 库 LockBox
LockBox 是用于 Delphi 的一套加密/解密控件
最早是一套商业控件,后来开源了。再后来,又有一个新版本的 LockBox,和旧版本完全不同。
旧版本的 LockBox 叫 LockBox 2;新版本的叫 LockBox 3。
这两个控件,都可以通过 Delphi IDE 的 GetIt 来安装。也可以自己去 github 下载源代码来安装。
LockBox3 怎么使用,我还没搞明白。
这里讲的是如何使用 LockBox 2 的 RSA 加密。
RSA 加密的一般概念
RSA 加密是非对称加密。首先要产生一对密钥:一个叫公钥,公开给别人的;一个叫私钥,自己留着的。私钥一定要保留好,不能泄露。
通常的用法之一:
别人使用公钥加密的信息,传递给你。你使用私钥解密。其它人也能够拿到公钥,但这个加密信息用公钥无法解开,只能用私钥解开。而私钥只你自己有,所以加密信息不怕别人拿到导致泄密。
通常的用法之二:
签名。你用自己的私钥给一个文件或者一条信息签名后发送给别人。这个签名的信息本身是没有加密的,仅仅是用私钥加密了信息的摘要(HASH 值)。收到信息(文件)的人,用你的公钥解密HASH值,然后再自己对收到的信息或者文件做 HASH,对比两个 HASH 值,如果相同,说明文件没有被篡改。
上述两种用法,LockBox 2 都提供了对应的控件:
1. TLbRSA:用于 RSA 的加密/解密。在 Delphi IDE 里面安装好 LockBox 2 以后,拖控件到 Form 上面,就能使用了;
2. TLbRSASSA:用于签名。同样是拖控件到 Form 上,就能使用。
进阶玩法
上面的普通玩法,就是公钥加密信息,然后用私钥解密信息。那么,如果我要用私钥加密信息,用公钥解密呢?直接使用 TLbRSA 这个控件就不行了。它没有提供。
但是,看看 TLbRSA 的源代码,大概就知道该怎么写代码了。
当然,绕开 TLbRSA 这个控件,使用它底层一些的函数和方法,必须引用 LockBox 2 的单元:LbRSA.pas;然后,
概念如下:
1. 公钥私钥都使用 TLbRSAKey 类型;
2. 创建公钥私钥:TRSA.GenerateRSAKeysEx(PriKey, PubKey, TLbAsymKeySize.aks512, 20, nil);
3. 创建好的,想要保存为文件或者输出:TLbRSAKey.StoreToStream 或者 StoreToFile;这里输出的是二进制数据。可以考虑拿到以后用 BASE64 编码为字符串后传输或者保存;
4. 加密或者解密的使用:
4.1. 创建 TLbRSAKey 实例,读入之前创建好的公钥或者私钥的数据;
4.2. 调用 TRSA.RSAEncryptBytes() 方法;这个方法有3个参数:TBytes 是需要加密/解密的数据,TLbRSAKey 是用来加密/解密的密钥;Boolean = True 是加密操作,False 是解密操作。
例子代码:
1. 创建公钥/私钥。创建好的密钥,保存为文件。公钥的话,就可以发出去给别人使用了。
这里,我使用了 2 种保存密钥的方式,都测试通过。
A. 取其属性字符串,写入 TStringList 里面再存入文件。加载时用 TStringList 加载文件后,为其字符串属性赋值完成密钥加载。
B. 它有 StoreToFile 的方法,直接保存为文件。当然,这里保存的文件是二进制文件,不是文本文件。如果需要文件是文本的话,可以把这个二进制文件的内容做 BASE64 编码。
procedure TForm5.CreatePairKey;
varPubKey: TLbRSAKey;PriKey: TLbRSAKey;RSACallback: TLbRSACallback; //这是个事件方法,显示进度用。
begin//创建 KeyTRSA.GenerateRSAKeysEx(PriKey, PubKey, TLbAsymKeySize.aks512, 20, nil);if not Assigned(Self.FPubKey) then Self.FPubKey := TStringList.Create;if not Assigned(Self.FPriKey) then Self.FPriKey := TStringList.Create;//保存为 StringList 然后保存为文件Self.FPubKey.Clear;Self.FPubKey.Add(PubKey.ModulusAsString);Self.FPubKey.Add(PubKey.ExponentAsString);Self.SavePubKey; Self.FPriKey.Clear;Self.FPriKey.Add(PriKey.ModulusAsString);Self.FPriKey.Add(PriKey.ExponentAsString);Self.SavePriKey;//直接保存为文件PubKey.StoreToFile(Self.GetPubKeyFn2); PriKey.StoreToFile(Self.GetPriKeyFn2);
end;
2. 使用 TStringList 保存的字符串密钥来加密
procedure TForm5.Button6Click(Sender: TObject);
varPriKey: TLbRSAKey;B: TBytes;S: string;
begin//验证把 Key 存储为 TStringList 以后载入使用;加密PriKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);PriKey.ModulusAsString := Self.FPriKey[0];PriKey.ExponentAsString := Self.FPriKey[1];B := TRSA.RSAEncryptBytes(TEncoding.Unicode.GetBytes('这是我用 RSA 私钥加密后的字符串。'), PriKey, True);//编码为 BASE64var Base64 := TBase64Encoding.Create;S := Base64.EncodeBytesToString(B);var SL := TStringList.Create;trySL.Add(S);SL.SaveToFile(Self.GetMyEncodedMessageFn);finallySL.Free;end;
end;
3. 使用 TStringList 存储的字符串密钥来解密:
procedure TForm5.Button7Click(Sender: TObject);
varPubKey: TLbRSAKey;S: string;B: TBytes;
beginPubKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);PubKey.ModulusAsString := Self.FPubKey[0];PubKey.ExponentAsString := Self.FPubKey[1];//解密var SL := TStringList.Create;SL.LoadFromFile(Self.GetMyEncodedMessageFn);S := SL.Text;var Base64 := TBase64Encoding.Create;B := Base64.DecodeStringToBytes(S);B := TRSA.RSAEncryptBytes(B, PubKey, False);S := TEncoding.Unicode.GetString(B);Memo1.Lines.Add(S);
end;
4. 直接加载保存的二进制密钥文件来解密:
procedure TForm5.Button9Click(Sender: TObject);
varPubKey: TLbRSAKey;S: string;B: TBytes;
beginPubKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);//用公钥解密,直接加载保存为文件的密钥二进制文件PubKey.LoadFromFile(Self.GetPubKeyFn2);//从文件加载加密后的密文字符串var SL := TStringList.Create;SL.LoadFromFile(Self.GetMyEncodedMessageFn);S := SL.Text; //这里是加密后的字符串。var Base64 := TBase64Encoding.Create;B := Base64.DecodeStringToBytes(S);//执行解密B := TRSA.RSAEncryptBytes(B, PubKey, False);S := TEncoding.Unicode.GetString(B);Memo1.Lines.Add(S);
end;
结论:
使用 TLbRSAKey 和 TRSA 的几个方法,完成非对称加密 RSA 的密钥创建,密钥输出,密钥加载,加密/解密的过程,可以做到用公钥加密后用私钥解密,也可以做到用私钥加密后,用公钥解密。
当然,普通的玩法,也可以使用 TLbRSA 和 TLbRSASSA,拖控件到界面上直接使用。
相关文章:
Delphi 的 RSA 库 LockBox
LockBox 是用于 Delphi 的一套加密/解密控件 最早是一套商业控件,后来开源了。再后来,又有一个新版本的 LockBox,和旧版本完全不同。 旧版本的 LockBox 叫 LockBox 2;新版本的叫 LockBox 3。 这两个控件,都可以通过…...
element UI学习使用(1)
https://element.eleme.cn/2.6/#/zh-CN/component/container vue模块库,可复制直接使用 1、搜索框、下拉搜索框 <el-form :inline"true" class"demo-form-inline"><el-form-item label"结果搜索"><el-inputplaceho…...
如何搞定日语翻译?试试这四款工具
写一篇字数800-1000字的软文,用翻译新手的角度分享福昕翻译在线、福昕翻译客户端、海鲸AI翻译以及彩云翻译在翻译日语时候的表现,要求口语化表达。 最近对于一些轻小说突然感兴趣了,所以我开始尝试各种翻译工具来帮助我搞定日语翻译。今天&am…...
【STM32】独立看门狗(IWDG)原理详解及编程实践(上)
本篇文章是对STM32单片机“独立看门狗(IWDG)”的原理进行讲解。希望我的分享对你有所帮助! 目录 一、什么是独立看门狗 (一)简介 (二)、独立看门狗的原理 (三)、具体操…...
前端框架大观:探索现代Web开发的基石
目录 引言 一、前端框架概述 二、主流前端框架介绍 2.1 React 2.1.1 简介 2.1.2 特点 2.1.3 代码示例 2.2 Vue.js 2.2.1 简介 2.2.2 特点 2.2.3 代码示例 2.3 Angular 2.3.1 简介 2.3.2 特点 2.3.3 代码示例 三、其他前端框架与库 四、前端框架的选择 五、结…...
16 训练自己语言模型
在很多场景下下,可能微调模型并不能带来一个较好的效果。因为特定领域场景下,通用话模型过于通用,出现多而不精。样样通样样松;本章主要介绍如何在特定的数据上对模型进行预训练; 训练自己的语言模型(从头开…...
udp网络通信 socket
套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性,端口可以标定进程在主机的唯一性,那么socket通过IP端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种: 域间套接字:实现主机内部的进程通信的编程 …...
LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色
EXAONE 3.0介绍:愿景与目标 EXAONE 3.0是LG AI研究所在语言模型发展中的一个重要里程碑,特别是在专家级AI领域。 “EXAONE”这个名称源自于“ EX pert A I for Every ONE”,反映了LG AI研究所致力于将专家级别的人工智能能力普及化的承诺。这…...
【mysql】mysql之主从部署以及介绍
本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》:python零基础入门学习 《python运维脚本》: python运维脚本实践 《shell》:shell学习 《terraform》持续更新中:terraform_Aws学习零基础入门到最佳实战 《k8…...
Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具
关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具,旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器,该解析器处理标记化和语法树解析以及众多自定义属性&#x…...
QT 读取Excel表
一、QAxObject 读取excel表的内容,其仅在windows下生效,当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…...
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909
深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用 在前端开发中,样式的管理与组件化开发之间的平衡一直是一个难题。Vue.js 提供了一些强大的工具来帮助开发者在开发复杂的应用时管理样式。这篇文章将详细介绍 Vue 中的 scoped、:deep() 和…...
C语言内存函数(21)
文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始,发车! 一、memcpy的使用和模拟实现 函数模型:void* memcpy(void* destination, const void* source, size…...
三高基本概念之-并发和并行
并行和并发是计算机科学中两个重要但容易混淆的概念,它们之间的主要区别可以从以下几个方面进行阐述: 一、定义与含义 并行(Parallel):并行是指两个或多个事件在同一时刻发生,即这些事件在微观和宏观上都…...
宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”
参考 https://blog.csdn.net/neizhiwang/article/details/106628899 错误描述 我得服务器是腾讯,然后使用宝塔建了个HTML网站,寻思用ftp上传,结果报错: 状态: 连接建立,等待欢迎消息... 状态: 初始化 TLS 中... 状…...
面试的一些小小经验
无论何时,找到合适的满意的工作(距离住处的地理位置,薪资,工作氛围)并不是一件容易的事情。个人能力与职位的适配性永远是有误差的客观存在。 十全十美难得,满足个人的个体化优先级才是客观的存在。 1.投简…...
IV转换放大器原理图及PCB设计分析
【前言】 今天给大家分享一下关于IV转换放大器的相关电路设计心得。IV转换使用的场合非常之多,尤其是电流型输出的传感器,比如光敏二极管、硅光电池等等,这些传感器输出的电流信号非常微弱,我们如果需要检测它们,首先得…...
【数学建模经验贴】一个研赛数模老手的经验
我(非C君,是一个朋友)参加了3次“深圳杯”数模,1次全国大学生数模,以及1次全国研究生数模,2016年参加了全国研究生数模的交流会,但没有参加过美赛,应该算是一个江湖老手了吧。下面内…...
vivo手机已删除的短信还能恢复吗?
虽然现在我们很少使用vivo手机的短信功能,但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信,该怎么恢复呢? 方法一:通过vivo云服务恢复 1、确保您已开启vivo云服务…...
[网络][CISCO]CISCO IOS升级
CISCO IOS升级-(转)2008-06-27 15:35IOS 升级 在介绍CISCO路由器IOS升级方法前,有必要对Cisco路由器的存储器的相关知识作以简单介绍。路由器与计算机相似,它也有内存和操作系统。在Cisco路由器中,其操作系统叫做互连…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
React第五十七节 Router中RouterProvider使用详解及注意事项
前言 在 React Router v6.4 中,RouterProvider 是一个核心组件,用于提供基于数据路由(data routers)的新型路由方案。 它替代了传统的 <BrowserRouter>,支持更强大的数据加载和操作功能(如 loader 和…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
DingDing机器人群消息推送
文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人,点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置,详见说明文档 成功后,记录Webhook 2 API文档说明 点击设置说明 查看自…...
MySQL JOIN 表过多的优化思路
当 MySQL 查询涉及大量表 JOIN 时,性能会显著下降。以下是优化思路和简易实现方法: 一、核心优化思路 减少 JOIN 数量 数据冗余:添加必要的冗余字段(如订单表直接存储用户名)合并表:将频繁关联的小表合并成…...
