🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #345481

Szyfrowanie plików JPK z użyciem SecureBox'a

#345481
From: kameleonsql
Date: Tue, 27 Dec 2016 08:35
98 lines
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-mail

Show 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