当前位置: 首页 > 知识库问答 >
问题:

RSA使用公钥和LockBox3加密

任宾鸿
2023-03-14

我使用Delphi XE和Lockbox3.5,我想加密一个字符串,该字符串具有支付网关提供的公钥,需要操作,公钥类似于:------开始公钥------这里的职员------结束公钥------我无法使RSA编解码器读取该公钥,我的代码如下:

var
 Ciphertext: string;
 ms: TStream;
begin
 ms := TFileStream.Create('C:\PubKey.txt', fmOpenRead);
 ms.Seek(0, soFromBeginning);
 cdcRSA.StreamCipherId := RSA_ProgId;
 cdcRSA.ChainModeId := RSA_ProgId;
 Signatory1.LoadKeysFromStream(ms, [partPublic]);
 cdcRSA.EncryptAnsiString('WORDSOMEWORDSOME', Ciphertext);
 Memo1.Lines.Add(Ciphertext);
end;

编解码器cdcRA链接到CryptoLibrary,密码为(RSA公钥加密系统*),链接模式为空,但此代码失败,并出现内存不足错误。谢谢你的提示。。

演示中的以下代码也不起作用,有人可以提供一个使用RSA和公钥加密字符串的示例吗

procedure TForm1.btnRSAClick(Sender: TObject);
var
 sKey, Ciphertext: string;
 ss: TStringStream;
 Key: TSymetricKey;
begin
 sKey := '-----BEGIN PUBLIC KEY-----' +
         'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+' +
         'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl' +
         'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o' +
         'ywRq5Mwk4dHPX1F5EwIDAQAB' +
         '-----END PUBLIC KEY-----';

 ss := TStringStream.Create(sKey);  ss.Seek(0,soFromBeginning);
 Base64_to_stream(skey, ss);
 cdcRSA.Reset;
 cdcRSA.StreamCipherId := 'native.RSA';
 cdcRSA.ChainModeId:= 'native.CBC';
 cdcRSA.AsymetricKeySizeInBits := 1024;
 key := cdcRSA.Asymetric_Engine.CreateFromStream(ss, [partPublic]); // error out of memory
 cdcRSA.InitFromKey(key);  
 cdcRSA.EncryptString('WORDSOMEWORDSOME', Ciphertext, TEncoding.UTF8);
 Memo1.Lines.Add(Ciphertext);
end;

共有2个答案

齐向笛
2023-03-14

密钥文件是一个文本文件,包含一系列行。文件中的每行长度不得超过72个8位字节,不包括行终止字符。

硬编码字符串只有一行,长度为358加上起始/结束行

我们看不到C:\PubK的内容ey.txt.看起来文件一样?

添加<代码>

sKey := '-----BEGIN PUBLIC KEY-----'#13#10 +
         'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+'#13#10 +
         'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl'#13#10 +
         'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o'#13#10 +
         'ywRq5Mwk4dHPX1F5EwIDAQAB'#13#10 +
         '-----END PUBLIC KEY-----';

同时阅读差异。。。

BEGIN RSA公共密钥和BEGIN公共密钥之间的区别

用线条

ss := TStringStream.Create(sKey);  ss.Seek(0,soFromBeginning);
 Base64_to_stream(skey, ss);

您使用包含的行BEGIN执行Base64_to_stream(skey, ss)......和END......

应该是这样的

-----BEGIN PUBLIC KEY-----
BASE64 ENCODED DATA
-----END PUBLIC KEY-----
sKeyBEG := '-----BEGIN PUBLIC KEY-----'#13#10;

sKey := 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDlAVd8PUhIiuA00vlUZYm0xrk+' +
        'UgyZxwWZSrysOJWk0POGJ91hUUqr659mBA7bg0i07Y4T+FYdA4iuvg5bT2aSMAGl' +
        'To3GRKvwX8RAnimQQNqkqDk3nf20OiEygwWDQr72fWzKLtuoo7Rd5onrXEp1qM3o' +
        'ywRq5Mwk4dHPX1F5EwIDAQAB';

sKeyEND := #13#10'-----END PUBLIC KEY-----';

本质上,PEM文件只是DER编码数据的base64编码版本。为了与外部区分DER编码字符串内的数据类型,数据周围存在页眉和页脚。

如果要加载带有页眉和页脚的键文本文件,则需要找到将键与键分离的方法。txt文件。这并不难。

无论如何,Base64\u to\u流(skey,ss)只能应用于键,而不能应用于周围的文本。

汪建德
2023-03-14

问题可能在于您创建的ms变量-TFileStream:

var
 Ciphertext: string;
 ms: TStream;
begin
 ms := TFileStream.Create('C:\PubKey.txt', fmOpenRead);
 try
   ms.Seek(0, soFromBeginning);
   cdcRSA.StreamCipherId := RSA_ProgId;
   cdcRSA.ChainModeId := RSA_ProgId;
   Signatory1.LoadKeysFromStream(ms, [partPublic]);
 finally
   ms.Free;
 end;
 cdcRSA.EncryptAnsiString('WORDSOMEWORDSOME', Ciphertext);
 Memo1.Lines.Add(Ciphertext);
end;
 类似资料:
  • 问题内容: 我正在编写一个用于传输文件的小型应用程序,或多或少地将其作为一种学习更多编程加密基础的方法。这个想法是生成一个RSA密钥对,交换公共密钥,并发送AES iv和密钥以进一步解密。我想用接收者的RSA公钥加密AES密钥,如下所示: 然后,我将密钥值写给接收器,并按如下方式解密: 在控制台的另一端,我将其作为输出: 此外,如果我创建一个大小为16的字节数组,并将cipher.doFinal(

  • 对示例代码中应用的概念“带RSA加密的JSON Web令牌(JWT)”有疑问 参见:http://connect2id.com/products/nimbus-jose-jwt/examples/jwt-with-rsa-encryption 我的问题:为什么客户端使用私钥?为什么不在加密器上使用私钥,在解密器类上使用公钥呢? 欢迎对此RSA示例代码的概念方面进行澄清。

  • 并且我将这个函数称为用RSA公钥加密DSA密钥的函数:

  • 我需要在C#中加密数据,以便将其传递给Java。Java代码属于第三方,但我得到了相关的源代码,因此我决定,由于Java使用Bouncy Castle库,所以我将使用C#端口。 解密工作正常。但是,解密仅在使用私钥使用encrypt时有效,而不是使用公钥。使用公钥时,解密失败,出现。 编辑: 我还添加了一个单元测试,它证明公钥等于从私钥中提取的公钥:

  • 如果使用RSA-OAEP是不可能的,你能给出同样的方法吗? 谢谢

  • 我找到了几个可以使用的解决方案。Net RSA Provider使用公钥对消息进行加密,并使用私钥对其解密。 但我想要的是用私钥加密,用公钥解密。 我希望在我的应用程序中存储公钥,并使用私钥加密许可证,例如在我的开发人员计算机上,将其发送到应用程序,并让信息使用公钥解密。 我怎样才能做到这一点?