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路由器中,其操作系统叫做互连…...
【网络】每天掌握一个Linux命令 - iftop
在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...

抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
pycharm 设置环境出错
pycharm 设置环境出错 pycharm 新建项目,设置虚拟环境,出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
机器学习的数学基础:线性模型
线性模型 线性模型的基本形式为: f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法,得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...