RSA-шифрование с открытым ключом и LockBox3 - PullRequest
2 голосов
/ 15 марта 2019

Я использую Delphi XE и Lockbox3.5, я хочу зашифровать строку, имеющую открытый ключ, предоставленный платежным шлюзом, который требует операции, открытый ключ что-то вроде: ----- НАЧАТЬ ПУБЛИЧНЫЙ КЛЮЧ ----- персонал здесь ----- КОНЕЦ ОБЩЕСТВЕННОГО КЛЮЧА ----- Я не могу кодек make 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 ]

0 голосов
/ 28 марта 2019

Ключевой файл - это текстовый файл, содержащий последовательность строк.Каждая строка в файле ДОЛЖНА НЕ быть длиннее 72 8-битных байтов, за исключением символов окончания строки.

Ваша жестко закодированная строка содержит только одну строку с длиной 358 плюс строки BEGIN / END

Мы не можем видеть содержимое C: \ PubKey.txt .Выглядит файл так же?

Добавить <CR><LF> в конце

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

Также читайте о различиях ...

Различия между BEGIN RSA PUBLIC KEYи НАЧАТЬ ОБЩЕСТВЕННЫЙ КЛЮЧ

Со строками

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

вы делаете Base64_to_stream(skey, ss) с включенными строками BEGIN .... и END ....

Это должноbe

-----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 представляют собой просто кодированные в формате base64 версии данных, кодированных с помощью DER.Чтобы отличить извне, какие данные находятся внутри строки, закодированной в DER, верхний и нижний колонтитулы присутствуют вокруг данных .

Если вы хотите загрузить ключтекстовый файл с верхним и нижним колонтитулом, вам нужно найти способ отделить ключ от файла key.txt.Это не сложно.

В любом случае, Base64_to_stream(skey, ss) можно применять только к клавише, но не к окружающему тексту.

0 голосов
/ 15 марта 2019

проблема может быть в свободной переменной 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;
...