Delphi 的 RSA 库 LockBox

打印 上一主题 下一主题

主题 331|帖子 331|积分 993

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 编码。
  1. procedure TForm5.CreatePairKey;
  2. var
  3.   PubKey: TLbRSAKey;
  4.   PriKey: TLbRSAKey;
  5.   RSACallback: TLbRSACallback; //这是个事件方法,显示进度用。
  6. begin
  7.   //创建 Key
  8.   TRSA.GenerateRSAKeysEx(PriKey, PubKey, TLbAsymKeySize.aks512, 20, nil);
  9.   if not Assigned(Self.FPubKey) then Self.FPubKey := TStringList.Create;
  10.   if not Assigned(Self.FPriKey) then Self.FPriKey := TStringList.Create;
  11.   //保存为 StringList 然后保存为文件
  12.   Self.FPubKey.Clear;
  13.   Self.FPubKey.Add(PubKey.ModulusAsString);
  14.   Self.FPubKey.Add(PubKey.ExponentAsString);
  15.   Self.SavePubKey;   
  16.   Self.FPriKey.Clear;
  17.   Self.FPriKey.Add(PriKey.ModulusAsString);
  18.   Self.FPriKey.Add(PriKey.ExponentAsString);
  19.   Self.SavePriKey;
  20.   //直接保存为文件
  21.   PubKey.StoreToFile(Self.GetPubKeyFn2);  
  22.   PriKey.StoreToFile(Self.GetPriKeyFn2);  
  23. end;
复制代码
2. 利用 TStringList 生存的字符串密钥来加密

  1. procedure TForm5.Button6Click(Sender: TObject);
  2. var
  3.   PriKey: TLbRSAKey;
  4.   B: TBytes;
  5.   S: string;
  6. begin
  7.   //验证把 Key 存储为 TStringList 以后载入使用;加密
  8.   PriKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);
  9.   PriKey.ModulusAsString := Self.FPriKey[0];
  10.   PriKey.ExponentAsString := Self.FPriKey[1];
  11.   B := TRSA.RSAEncryptBytes(TEncoding.Unicode.GetBytes('这是我用 RSA 私钥加密后的字符串。'), PriKey, True);
  12.   //编码为 BASE64
  13.   var Base64 := TBase64Encoding.Create;
  14.   S := Base64.EncodeBytesToString(B);
  15.   var SL := TStringList.Create;
  16.   try
  17.     SL.Add(S);
  18.     SL.SaveToFile(Self.GetMyEncodedMessageFn);
  19.   finally
  20.     SL.Free;
  21.   end;
  22. end;
复制代码
3. 利用 TStringList 存储的字符串密钥来解密:

  1. procedure TForm5.Button7Click(Sender: TObject);
  2. var
  3.   PubKey: TLbRSAKey;
  4.   S: string;
  5.   B: TBytes;
  6. begin
  7.   PubKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);
  8.   PubKey.ModulusAsString := Self.FPubKey[0];
  9.   PubKey.ExponentAsString := Self.FPubKey[1];
  10.   //解密
  11.   var SL := TStringList.Create;
  12.   SL.LoadFromFile(Self.GetMyEncodedMessageFn);
  13.   S := SL.Text;
  14.   var Base64 := TBase64Encoding.Create;
  15.   B := Base64.DecodeStringToBytes(S);
  16.   B := TRSA.RSAEncryptBytes(B, PubKey, False);
  17.   S := TEncoding.Unicode.GetString(B);
  18.   Memo1.Lines.Add(S);
  19. end;
复制代码
4. 直接加载生存的二进制密钥文件来解密:

  1. procedure TForm5.Button9Click(Sender: TObject);
  2. var
  3.   PubKey: TLbRSAKey;
  4.   S: string;
  5.   B: TBytes;
  6. begin
  7.   PubKey := TLbRSAKey.Create(TLbAsymKeySize.aks512);
  8.   //用公钥解密,直接加载保存为文件的密钥二进制文件
  9.   PubKey.LoadFromFile(Self.GetPubKeyFn2);
  10.   //从文件加载加密后的密文字符串
  11.   var SL := TStringList.Create;
  12.   SL.LoadFromFile(Self.GetMyEncodedMessageFn);
  13.   S := SL.Text;  //这里是加密后的字符串。
  14.   var Base64 := TBase64Encoding.Create;
  15.   B := Base64.DecodeStringToBytes(S);
  16.   //执行解密
  17.   B := TRSA.RSAEncryptBytes(B, PubKey, False);
  18.   S := TEncoding.Unicode.GetString(B);
  19.   Memo1.Lines.Add(S);
  20. end;
复制代码

结论:

利用 TLbRSAKey 和 TRSA 的几个方法,完成非对称加密 RSA 的密钥创建,密钥输出,密钥加载,加密/解密的过程,可以做到用公钥加密后用私钥解密,也可以做到用私钥加密后,用公钥解密。
固然,普通的玩法,也可以利用 TLbRSA 和 TLbRSASSA,拖控件到界面上直接利用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

高级会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表