Article View: pl.comp.lang.delphi
Article #345481Szyfrowanie plików JPK z użyciem SecureBox'a
From: kameleonsql
Date: Tue, 27 Dec 2016 08:35
Date: Tue, 27 Dec 2016 08:35
98 lines
4932 bytes
4932 bytes
Witam,
mamy mały problem z szyfrowaniem plików JPK używając SecureBox'a (Delphi 2010). Kod był zlecony na zewnątrz firmy (niestety programista, który to robił jest nieosiągalny ...) i kurcze dopiero teraz się okazało, że jest błąd w szyfrowaniu (nikt nie wie dlaczego dopiero teraz :( to wyszło, ale cóż się zdarza).Generalnie problem polega chyba na implementacji zmiennych bo jak jest (tak jest w wersji w której server MF zwraca błąd, co prawda UOP przychodzi po kilkunastu godzina) tak :
Crypto := Fac.CreateInstance(SB_ALGORITHM_CNT_AES256)
to serwer MF zwraca błąd 412 (plik nieprawidłowo zaszyfrowany), ale kod działa i plik jest szyfrowany. Natomiast jeśli użyję się (chyba to powinno być szyfrowane w ten sposób)
Crypto := Fac.CreateInstance(SB_ALGORITHM_DGST_SHA256,cmCBC);
to mamy błąd EAccess Viol .... w
Crypto.KeyMaterial := KM;
Szukam kogoś "kumatego" w temacie, co by oczywiście odpłatnie to szybko poprawił ..
Całość kodu do szyfrowania poniżej.
function JPK_AES_Encode(InDataStream: TmemoryStream; UsedUniqueKey: string;
out IV_Base64: AnsiString): TmemoryStream;
var
Fac: TElSymmetricCryptoFactory;
CP: TElWin32CryptoProvider;
CPOps: TElWin32CryptoProviderOptions;
Crypto: TElSymmetricCrypto;
KM: TElSymmetricKeyMaterial;
Key, IV: ByteArray;
TestStream: TmemoryStream;
begin
Result := TmemoryStream.Create;
try
// przenosimy wygenerowany wcześniej klucz do ByteArray
SetLength(Key, 32);
System.Move(UsedUniqueKey[1], Key[0], 32);
// UWAGA: wg niektórych powinien to być bieżace data/czas z dokładnościa do 0.001 sek.
SetLength(IV, 16);
SBRndGenerate(@IV[0], Length(IV));
Fac := TElSymmetricCryptoFactory.Create();
try
CPOps := TElWin32CryptoProviderOptions.Create();
try
CPOps.UseForSymmetricKeyOperations := TRUE;
CP := TElWin32CryptoProvider.Create(CPOps, NIL);
try
Fac.CryptoProvider := CP;
// UWAGA: to MUSI być AES256 !!!
// SB_ALGORITHM_PK_RSA
Crypto := Fac.CreateInstance(SB_ALGORITHM_CNT_AES256);
try
KM := TElSymmetricKeyMaterial.Create(CP);
try
TestStream := TmemoryStream.Create;
// UWAGA: klucz NIE jest zaszyfrowany w tym przypadku...
KM.Key := Key;
KM.IV := IV;
// przekazujemy IV jako Base64
IV_Base64 := TIdEncoderMIME.EncodeBytes(TIdBytes(IV));
Crypto.KeyMaterial := KM;
// szyfrowanie
InDataStream.Position := 0;
Crypto.Encrypt(InDataStream, Result);
Result.Position := 0;
// deszyfrowanie (dla testu - potem można będzie wyrzucić ew.)
Crypto.Decrypt(Result, TestStream);
Result.Position := 0;
// weryfikacja...
if not StreamsCompare(TestStream, InDataStream) then
Raise Exception.Create
('Bład szyfrowania wygenerowanego hasła jednorazowego (AES)!');
Result.Position := 0;
{$IFDEF DEBUG}
Result.SaveToFile(SetJpkXmlSendFile + 'test.zip.aes');
Result.Position := 0;
{$ENDIF}
InDataStream.Position := 0;
finally
if Assigned(TestStream) then
TestStream.Free;
FreeAndNil(KM);
end;
finally
FreeAndNil(Crypto);
end;
finally
FreeAndNil(CP);
end;
finally
FreeAndNil(CPOps);
end;
finally
FreeAndNil(Fac);
end;
except
FreeAndNil(Result);
Raise ;
end;
end;
Technical Details
Message-ID:
<160e2225-3fe2-4d6a-9e75-b032066e09b5@googlegroups.com>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!75no3849392ite.0!news-out.google.com!u18ni13227ita.0!nntp.google.com!b123no3850715itb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mailShow Full Headers
Complete Article Headers
X-Received: by 10.99.108.8 with SMTP id h8mr17154456pgc.50.1482827722839; Tue, 27 Dec 2016 00:35:22 -0800 (PST) X-Received: by 10.157.17.3 with SMTP id g3mr1644700ote.8.1482827722785; Tue, 27 Dec 2016 00:35:22 -0800 (PST) Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit0.net!news.glorb.com!75no3849392ite.0!news-out.google.com!u18ni13227ita.0!nntp.google.com!b123no3850715itb.0!postnews.google.com!glegroupsg2000goo.googlegroups.com!not-for-mail Newsgroups: pl.comp.lang.delphi Date: Tue, 27 Dec 2016 00:35:22 -0800 (PST) Complaints-To: groups-abuse@google.com Injection-Info: glegroupsg2000goo.googlegroups.com; posting-host=91.234.102.48; posting-account=lJNmiQoAAAAcuwZEAibFvFBE7IgRs9bN NNTP-Posting-Host: 91.234.102.48 User-Agent: G2/1.0 MIME-Version: 1.0 Message-ID: <160e2225-3fe2-4d6a-9e75-b032066e09b5@googlegroups.com> Subject: Szyfrowanie plików JPK z użyciem SecureBox'a From: kameleonsql@gmail.com Injection-Date: Tue, 27 Dec 2016 08:35:22 +0000 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit