当前位置: 首页 > news >正文

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模块库&#xff0c;可复制直接使用 1、搜索框、下拉搜索框 <el-form :inline"true" class"demo-form-inline"><el-form-item label"结果搜索"><el-inputplaceho…...

如何搞定日语翻译?试试这四款工具

写一篇字数800-1000字的软文&#xff0c;用翻译新手的角度分享福昕翻译在线、福昕翻译客户端、海鲸AI翻译以及彩云翻译在翻译日语时候的表现&#xff0c;要求口语化表达。 最近对于一些轻小说突然感兴趣了&#xff0c;所以我开始尝试各种翻译工具来帮助我搞定日语翻译。今天&am…...

【STM32】独立看门狗(IWDG)原理详解及编程实践(上)

本篇文章是对STM32单片机“独立看门狗&#xff08;IWDG&#xff09;”的原理进行讲解。希望我的分享对你有所帮助&#xff01; 目录 一、什么是独立看门狗 &#xff08;一&#xff09;简介 &#xff08;二&#xff09;、独立看门狗的原理 &#xff08;三&#xff09;、具体操…...

前端框架大观:探索现代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 训练自己语言模型

在很多场景下下&#xff0c;可能微调模型并不能带来一个较好的效果。因为特定领域场景下&#xff0c;通用话模型过于通用&#xff0c;出现多而不精。样样通样样松&#xff1b;本章主要介绍如何在特定的数据上对模型进行预训练&#xff1b; 训练自己的语言模型&#xff08;从头开…...

udp网络通信 socket

套接字是实现进程间通信的编程。IP可以标定主机在全网的唯一性&#xff0c;端口可以标定进程在主机的唯一性&#xff0c;那么socket通过IP端口号就可以让两个在全网唯一标定的进程进行通信。 套接字有三种&#xff1a; 域间套接字&#xff1a;实现主机内部的进程通信的编程 …...

LG AI研究开源EXAONE 3.0:一个7.8B双语语言模型,擅长英语和韩语,在实际应用和复杂推理中表现出色

EXAONE 3.0介绍&#xff1a;愿景与目标 EXAONE 3.0是LG AI研究所在语言模型发展中的一个重要里程碑&#xff0c;特别是在专家级AI领域。 “EXAONE”这个名称源自于“ EX pert A I for Every ONE”&#xff0c;反映了LG AI研究所致力于将专家级别的人工智能能力普及化的承诺。这…...

【mysql】mysql之主从部署以及介绍

本站以分享各种运维经验和运维所需要的技能为主 《python零基础入门》&#xff1a;python零基础入门学习 《python运维脚本》&#xff1a; python运维脚本实践 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8…...

Invoke-Maldaptive:一款针对LDAP SearchFilter的安全分析工具

关于Invoke-Maldaptive MaLDAPtive 是一款针对LDAP SearchFilter的安全分析工具&#xff0c;旨在用于对LDAP SearchFilter 执行安全解析、混淆、反混淆和安全检测。 其基础是 100% 定制的 C# LDAP 解析器&#xff0c;该解析器处理标记化和语法树解析以及众多自定义属性&#x…...

QT 读取Excel表

一、QAxObject 读取excel表的内容&#xff0c;其仅在windows下生效&#xff0c;当然还有其他跨平台的方案。 config qaxcontainer #include <QAxObject>QStringList GetSheets(const QString& strPath) {QAxObject* excel new QAxObject("Excel.Application&…...

深入理解 Vue 组件样式管理:Scoped、Deep 和 !important 的使用20240909

深入理解 Vue 组件样式管理&#xff1a;Scoped、Deep 和 !important 的使用 在前端开发中&#xff0c;样式的管理与组件化开发之间的平衡一直是一个难题。Vue.js 提供了一些强大的工具来帮助开发者在开发复杂的应用时管理样式。这篇文章将详细介绍 Vue 中的 scoped、:deep() 和…...

C语言内存函数(21)

文章目录 前言一、memcpy的使用和模拟实现二、memmove的使用和模拟实现三、memset函数的使用四、memcmp函数的使用总结 前言 正文开始&#xff0c;发车&#xff01; 一、memcpy的使用和模拟实现 函数模型&#xff1a;void* memcpy(void* destination, const void* source, size…...

三高基本概念之-并发和并行

并行和并发是计算机科学中两个重要但容易混淆的概念&#xff0c;它们之间的主要区别可以从以下几个方面进行阐述&#xff1a; 一、定义与含义 并行&#xff08;Parallel&#xff09;&#xff1a;并行是指两个或多个事件在同一时刻发生&#xff0c;即这些事件在微观和宏观上都…...

宝塔面板FTP连接时“服务器发回了不可路由的地址。使用服务器地址代替。”

参考 https://blog.csdn.net/neizhiwang/article/details/106628899 错误描述 我得服务器是腾讯&#xff0c;然后使用宝塔建了个HTML网站&#xff0c;寻思用ftp上传&#xff0c;结果报错&#xff1a; 状态: 连接建立&#xff0c;等待欢迎消息... 状态: 初始化 TLS 中... 状…...

面试的一些小小经验

无论何时&#xff0c;找到合适的满意的工作&#xff08;距离住处的地理位置&#xff0c;薪资&#xff0c;工作氛围&#xff09;并不是一件容易的事情。个人能力与职位的适配性永远是有误差的客观存在。 十全十美难得&#xff0c;满足个人的个体化优先级才是客观的存在。 1.投简…...

IV转换放大器原理图及PCB设计分析

【前言】 今天给大家分享一下关于IV转换放大器的相关电路设计心得。IV转换使用的场合非常之多&#xff0c;尤其是电流型输出的传感器&#xff0c;比如光敏二极管、硅光电池等等&#xff0c;这些传感器输出的电流信号非常微弱&#xff0c;我们如果需要检测它们&#xff0c;首先得…...

【数学建模经验贴】一个研赛数模老手的经验

我&#xff08;非C君&#xff0c;是一个朋友&#xff09;参加了3次“深圳杯”数模&#xff0c;1次全国大学生数模&#xff0c;以及1次全国研究生数模&#xff0c;2016年参加了全国研究生数模的交流会&#xff0c;但没有参加过美赛&#xff0c;应该算是一个江湖老手了吧。下面内…...

vivo手机已删除的短信还能恢复吗?

虽然现在我们很少使用vivo手机的短信功能&#xff0c;但是我们偶尔还会通过vivo手机短信功能接收一些重要的信息。如果我们在清理垃圾短信的时候误删了vivo手机重要短信&#xff0c;该怎么恢复呢&#xff1f; 方法一&#xff1a;通过vivo云服务恢复 1、确保您已开启vivo云服务…...

[网络][CISCO]CISCO IOS升级

CISCO IOS升级-&#xff08;转&#xff09;2008-06-27 15:35IOS 升级 在介绍CISCO路由器IOS升级方法前&#xff0c;有必要对Cisco路由器的存储器的相关知识作以简单介绍。路由器与计算机相似&#xff0c;它也有内存和操作系统。在Cisco路由器中&#xff0c;其操作系统叫做互连…...

开源像素艺术生成工具上手指南:像素幻梦2.0-Stable镜像免配置部署

开源像素艺术生成工具上手指南&#xff1a;像素幻梦2.0-Stable镜像免配置部署 1. 像素幻梦简介 像素幻梦(Pixel Dream Workshop)是一款基于FLUX.1-dev扩散模型构建的下一代像素艺术生成工具。它采用16-bit像素工坊风格的视觉设计&#xff0c;为创作者提供沉浸式的AI绘图体验。…...

OpenClaw安全实践:GLM-4.7-Flash本地化部署的权限控制指南

OpenClaw安全实践&#xff1a;GLM-4.7-Flash本地化部署的权限控制指南 1. 为什么需要关注OpenClaw的权限控制&#xff1f; 去年夏天&#xff0c;我在整理电脑上的财务报告时&#xff0c;无意中发现OpenClaw自动将我的税务文件同步到了一个陌生目录。这个意外让我意识到——当…...

华硕笔记本终极电池拯救指南:用G-Helper实现智能充电与健康修复

华硕笔记本终极电池拯救指南&#xff1a;用G-Helper实现智能充电与健康修复 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models …...

合宙 MCP 工具:TRAE AI 自然语言控制 Luatools 实操

合宙MCP工具基于 MCP 协议&#xff0c;实现 AI 大模型与 Luatools 的无缝连接&#xff0c;开发者通过简单 JSON 配置&#xff0c;就能在 TRAE 编辑器用自然语言操控 Luatools 完成固件下载、日志获取等操作&#xff0c;告别手动烧录的繁琐。 核心能力&#xff1a; 固件自动烧录…...

Win11Debloat:3步解决Windows系统卡顿与隐私泄露难题

Win11Debloat&#xff1a;3步解决Windows系统卡顿与隐私泄露难题 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本&#xff0c;用于从Windows中移除预装的无用软件&#xff0c;禁用遥测&#xff0c;从Windows搜索中移除Bing&#xff0c;以及执行各种其他更改以简化和改…...

OpenClaw跨平台部署:nanobot镜像在mac/Windows双系统实测

OpenClaw跨平台部署&#xff1a;nanobot镜像在mac/Windows双系统实测 1. 为什么选择nanobot镜像 第一次听说nanobot这个轻量级OpenClaw镜像时&#xff0c;我正被本地部署大模型的资源消耗问题困扰。作为一个经常在macOS和Windows双系统切换的开发者&#xff0c;我需要一个能在…...

当multisim遇见ai助手:快马平台如何智能分析与优化你的电路设计

作为一名电子设计爱好者&#xff0c;最近在InsCode(快马)平台尝试了一个特别有意思的项目——用AI辅助优化Multisim电路设计。整个过程就像有个专业的电子工程师在旁边实时指导&#xff0c;分享下我的实践心得&#xff1a; 直流工作点智能诊断 输入一个简单的晶体管放大电路后&…...

从CentOS 7迁移到Ubuntu 22.04 LTS,我整理了一份保姆级系统初始化脚本(含内核调优、换源、时区设置)

从CentOS 7迁移到Ubuntu 22.04 LTS&#xff1a;系统初始化与性能调优全指南 当CentOS 7走向生命周期的终点&#xff0c;许多运维团队正面临向新平台的战略转移。Ubuntu 22.04 LTS以其长期支持特性和活跃的社区生态&#xff0c;成为最受欢迎的替代选择之一。但迁移绝非简单的系统…...

3大核心功能:让iOS推送调试效率提升10倍的SmartPush工具全解析

3大核心功能&#xff1a;让iOS推送调试效率提升10倍的SmartPush工具全解析 【免费下载链接】SmartPush SmartPush,一款iOS苹果远程推送测试程序,Mac OS下的APNS工具APP,iOS Push Notification Debug App 项目地址: https://gitcode.com/gh_mirrors/smar/SmartPush 一、问…...

JetBrains推出AI智能体管理平台Central

为了帮助开发者控制日益增长的AI编程智能体队伍&#xff0c;JetBrains正在推出JetBrains Central&#xff0c;这是一个面向团队的智能体开发平台&#xff0c;用于管理和维持对这些智能体的监督。JetBrains Central的早期访问计划将于2026年第二季度开始&#xff0c;将有限量的设…...