Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Obsługa szyfrowania \ wysyłki JPK w Delphi (kod źródłowy :))

1,287 views
Skip to first unread message

kamel...@gmail.com

unread,
Aug 17, 2016, 3:28:05 AM8/17/16
to
Witam,
Mamy wszystko do szyfrowania / wysyłki plików JPK. Kod w Delphi 2010 (generalnie możemy przygotować to na dowolne Delphi). Jeśli ktoś jest zainteresowany to istnieje możliwość sprzedaży tego rozwiązania ze źródłami, zainteresowanych proszę na priva.

Pozdrawiam

kamel...@gmail.com

unread,
Aug 17, 2016, 3:56:02 AM8/17/16
to
Ps.
Do podpisu konieczna jest licencja na SecureBlackBox'a

mmm

unread,
Aug 17, 2016, 5:56:52 AM8/17/16
to
W dniu 2016-08-17 o 09:56, kamel...@gmail.com pisze:
SecureBlackBox to nie za duża kobyła do takiego problemu, tak w
telegraficznym skrócie co jest największym problem w całym tym procesie
wysyłania JPK ?



MMM







Eugeniusz Rink

unread,
Aug 17, 2016, 5:42:09 PM8/17/16
to
To jednak nie macie wszystkiego do szyfrowania/wysyłki plikow JPK...

Jak kupie licencja na SBB to w zasadzie mam wszystko...


Pozdrawiam

Eugeniusz Rink

darekm

unread,
Aug 18, 2016, 4:57:22 AM8/18/16
to
W dniu 2016-08-17 o 11:56, mmm pisze:
problemem jest dokumentacja (jest niejednoznaczna - choć po każdym
pytaniu sie "poprawiała")

potrzebne jest: MD5, SHA1, SHA256, szyfrowanie AES, szyfrowanie RSA z
certyfikatu, podpis z urządzenia kryptograficznego,
pakowanie ZIP, obsługa XML, obsługa JSON, REST, XADES, obsługa Azure

na wcześniejszych etapach były jeszcze bzip2 i tar (ciekawe dlaczego
wyleciały)

ktoś się chciał bardzo wykazać jak to projektował


--
Darek




>
> MMM
>
>
>
>
>
>
>

kamel...@gmail.com

unread,
Aug 18, 2016, 5:27:08 AM8/18/16
to
No jak widać z powyższego nie jest to proste :)

Miroslaw Rogula

unread,
Aug 18, 2016, 10:10:53 AM8/18/16
to
W dniu środa, 17 sierpnia 2016 09:28:05 UTC+2 użytkownik kamel...@gmail.com napisał:
Z tego co pisze na stronie ministerstwa to chyba nie będzie to potrzebne.

"Ministerstwo Finansów informuje, że udostępni aplikację kliencką do wysyłania plików JPK (xml) zgodnie z wymogami MF opisanymi w specyfikacji.
Będzie też możliwość importu danych do aplikacji z pliku csv w zdefiniowanym formacie zgodnym ze schematem dla JPK.
Szczegółowe informacje znajdą się w instrukcjach do aplikacji.
Termin udostępnienia 22.08.2016."

Jak to dobrze zrobią to będzie można się podłączyć do tej aplikacji i po kłopocie.

kamel...@gmail.com

unread,
Aug 18, 2016, 11:25:48 AM8/18/16
to
Sądząc po tym na jakim poziomie zostało to zaprojektowane, to nie wróży to raczej dobrze tej ichniejszej Aplikacji klienckiej. Poza tym, to jest dobra wola MF (ta Aplikacja kliencka), biorąc pod uwagę fakt, że pierwsze firmy mają przesłać do 25.08.2016 plik VAT razem z deklaracją VAT, to data 22.08.2016 jest jak najbardziej budząca nadzieje, że będzie to działało ....

kons...@wp.pl

unread,
Aug 20, 2016, 2:11:37 PM8/20/16
to

>
> No jak widać z powyższego nie jest to proste :)
>
Pitu Pitu

Ponieważ nie znam za dobrze C# dlatego nie skończone(skończyła się
licenicja na 2015), samemu dalej ciężko.

Używam Microsoft.XAdes z gita nie ze strony internetowej!

Należy używać NetFrameWork minimum 4.2 z uwagi na
CryptoConfig.AddAlgorithm...





Trzeba zmodyfikować aby działało AES256

do
namespace Microsoft.Xades
{
...
//trzeba dodać
public class RSAPKCS1SHA256SignatureDescription : SignatureDescription
{
public RSAPKCS1SHA256SignatureDescription()
{
base.KeyAlgorithm = typeof(RSACryptoServiceProvider).FullName;
base.DigestAlgorithm = typeof(SHA256Managed).FullName;
base.FormatterAlgorithm =
typeof(RSAPKCS1SignatureFormatter).FullName;
base.DeformatterAlgorithm =
typeof(RSAPKCS1SignatureDeformatter).FullName;

CryptoConfig.AddAlgorithm(typeof(SHA256CryptoServiceProvider), new
string[0]);
}

public override AsymmetricSignatureFormatter
CreateFormatter(AsymmetricAlgorithm key)
{
if (key == null)
{
throw new ArgumentNullException("key");
}
RSAPKCS1SignatureFormatter formatter = new
RSAPKCS1SignatureFormatter(key);
formatter.SetHashAlgorithm("SHA256");
return formatter;
}
}
}


Następnie zmienić funkcje ComputeSignature na

public new void ComputeSignature()
{
this.BuildDigestedReferences();
AsymmetricAlgorithm signingKey = base.SigningKey;
if (signingKey == null)
{
throw new
CryptographicException("Cryptography_Xml_LoadKeyFailed");
}
if (base.SignedInfo.SignatureMethod == null)
{
if (!(signingKey is DSA))
{
if (!(signingKey is RSA))
{
throw new
CryptographicException("Cryptography_Xml_CreatedKeyFailed");
}
if (base.SignedInfo.SignatureMethod == null)
{
base.SignedInfo.SignatureMethod =
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
}
}
else
{
base.SignedInfo.SignatureMethod =
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
}
}

CryptoConfig.AddAlgorithm(typeof(RSAPKCS1SHA256SignatureDescription),
new string[]
{
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"
});
SignatureDescription description =
CryptoConfig.CreateFromName(base.SignedInfo.SignatureMethod) as
SignatureDescription;
if (description == null)
{
throw new
CryptographicException("Cryptography_Xml_SignatureDescriptionNotCreated");
}
HashAlgorithm hash = description.CreateDigest();
if (hash == null)
{
throw new
CryptographicException("Cryptography_Xml_CreateHashAlgorithmFailed");
}
this.GetC14NDigest(hash, "ds");
this.m_signature.SignatureValue =
description.CreateFormatter(signingKey).CreateSignature(hash);
}




Następnie w zdarzeniu przycisku

private void button_Click(object sender, RoutedEventArgs e)
{


// Sign the XML that was just created and save it in a
// new file.
OpenFileDialog openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "XML|*.xml";
openFileDialog1.Title = "Wybierz plik xml";
if (openFileDialog1.ShowDialog() ==
System.Windows.Forms.DialogResult.OK)
{
X509Store store = new X509Store("MY", StoreLocation.CurrentUser);
store.Open(OpenFlags.ReadOnly |
OpenFlags.OpenExistingOnly);
X509Certificate2Collection collection =
(X509Certificate2Collection)store.Certificates;
X509Certificate2Collection fcollection =
(X509Certificate2Collection)collection.Find(X509FindType.FindByTimeValid,
DateTime.Now, false);
X509Certificate2Collection scollection =
X509Certificate2UI.SelectFromCollection(fcollection, "Wybierz
Certyfikat", "Proszę wskazać certyfikat do podpisu",
X509SelectionFlag.MultiSelection);
/* foreach (X509Certificate2 x509 in scollection)
{
XmlDocument doc = new XmlDocument();
byte[] rawdata = x509.RawData;
doc.PreserveWhitespace = false;
doc.Load(new
XmlTextReader(System.IO.Path.GetDirectoryName(openFileDialog1.FileName)
+ "\\initupload.xml"));
if (doc.DocumentElement == null) throw new
InvalidOperationException("Invalid XML document; no root element found.");
sign(openFileDialog1.FileName,

System.IO.Path.GetDirectoryName(openFileDialog1.FileName) +
"\\sinitupload.xml",
x509);
x509.Reset();
}
store.Close();*/
foreach (X509Certificate2 x509 in scollection)
{
signXades(openFileDialog1.FileName, x509);
//funkcja podpisująca

x509.Reset();
}
store.Close();
System.Environment.Exit(1);
}
}

w x509 mamy certyfikat pobrany z karty


następnie podpisywanie

private void signXades(string filepath, X509Certificate2 cert)
{
//string exportedKeyMaterial =
cert.PrivateKey.ToXmlString(true);
//RSACryptoServiceProvider key = new
RSACryptoServiceProvider(new CspParameters(24));
//key.PersistKeyInCsp = false;
// key.FromXmlString(cert.PrivateKey.ToXmlString(true)); //=
cert.PrivateKey;// .FromXmlString(exportedKeyMaterial);
XadesSignedXml signedXml = new XadesSignedXml(this.doc);
signedXml.Signature.Id = "id-1234";
signedXml.SigningKey = cert.PrivateKey;
signedXml.SignedInfo.CanonicalizationMethod =
"http://www.w3.org/2001/10/xml-exc-c14n#";
signedXml.SignedInfo.SignatureMethod =
"http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
Reference reference = new Reference();
reference.Id = "r-id-1";
reference.Uri = "";
reference.Type = "";
reference.AddTransform(new XmlDsigExcC14NTransform());

reference.AddTransform(CreateXPathTransform("not(ancestor-or-self::Signature)"));
reference.DigestMethod =
"http://www.w3.org/2001/04/xmlenc#sha256";
signedXml.AddReference(reference);
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(cert));
signedXml.KeyInfo = keyInfo;
Cert xadesCert = new Cert();
xadesCert.IssuerSerial.X509IssuerName = cert.IssuerName.Name;
xadesCert.IssuerSerial.X509SerialNumber = cert.SerialNumber;
xadesCert.CertDigest.DigestMethod.Algorithm =
"http://www.w3.org/2001/04/xmlenc#sha256";
xadesCert.CertDigest.DigestValue =
CryptHelper.Sha1(cert.RawData);
XadesObject xades = new XadesObject();
xades.QualifyingProperties.Target = string.Format("#{0}",
signedXml.Signature.Id);
xades.QualifyingProperties.SignedProperties.Id =
string.Format("xades-{0}", signedXml.Signature.Id);

xades.QualifyingProperties.SignedProperties.SignedSignatureProperties.SigningTime
= DateTime.Now;

xades.QualifyingProperties.SignedProperties.SignedSignatureProperties.SignaturePolicyIdentifier.SignaturePolicyImplied
= true;

xades.QualifyingProperties.SignedProperties.SignedSignatureProperties.SigningCertificate.CertCollection.Add(xadesCert);

//xades.QualifyingProperties.SignedProperties.SignedSignatureProperties.SignaturePolicyIdentifier
= new SignaturePolicyIdentifier();
DataObjectFormat fmt = new DataObjectFormat();
fmt.ObjectReferenceAttribute = string.Format("#{0}",
reference.Id);
fmt.MimeType = "text/xml";


xades.QualifyingProperties.SignedProperties.SignedDataObjectProperties.DataObjectFormatCollection.Add(fmt);


signedXml.AddXadesObject(xades);
signedXml.ComputeSignature();
this.doc.DocumentElement.AppendChild(signedXml.GetXml());
//this.doc.Save(filepath);



XmlElement xmlDigitalSignature = signedXml.GetXml();

string filetosave =
System.IO.Path.GetDirectoryName(filepath) + "\\sinitupload.xml";
XmlTextWriter xmltw = new XmlTextWriter(filetosave, new
UTF8Encoding(false));
doc.WriteTo(xmltw);
xmltw.Close();
}

Plik w ten sposób podpisany wysłany do bramki komunikat
"podpis nie jest w formacie xades-base"


Kod jest do ogólnego dostępu i wykorzystania.
w zamian oczekuję na publiczne wskazanie dlaczego nie działa i
poprawienie oraz publikację na tym forum poprawnego rozwiązania.

Na pohybe firmom żądającym za kilkanaście linijek kodu 5000zł, to nie żart.
















mmm

unread,
Aug 22, 2016, 4:28:58 AM8/22/16
to
W dniu 2016-08-18 o 16:10, Miroslaw Rogula pisze:
Coś udostępnili (aplikacja przygotowane przez Billennium)
http://www.mf.gov.pl/kontrola-skarbowa/dzialalnosc/jednolity-plik-kontrolny/-/asset_publisher/2NoO/content/aplikacja-kliencka-do-wysylania-plikow-jpk

Szkoda tylko że nie pomyśleli o wersji z linii poleceń

M

kons...@wp.pl

unread,
Aug 22, 2016, 12:47:05 PM8/22/16
to
W dniu 2016-08-22 o 10:29, mmm pisze:
U mnie na WIn7 program wysypał się przy imporcie ich pliku csv.

al...@pro.onet.pl

unread,
Jan 7, 2017, 3:32:25 PM1/7/17
to
W dniu środa, 17 sierpnia 2016 09:28:05 UTC+2 użytkownik kamel...@gmail.com napisał:

al...@pro.onet.pl

unread,
Jan 7, 2017, 3:32:39 PM1/7/17
to
W dniu środa, 17 sierpnia 2016 09:28:05 UTC+2 użytkownik kamel...@gmail.com napisał:

j.no...@gmail.com

unread,
Mar 24, 2017, 8:14:06 AM3/24/17
to
Jestem zainteresowany współpracą. Proszę o kontakt: jnw <at> simple <dot> com <dot> pl.

al

unread,
Jun 25, 2017, 9:56:36 PM6/25/17
to
Hmm
Do podpisu używam darmowej biblioteki EC2XadesDll.dll ze strony http://pemi.ayz.pl/forum/viewforum.php?f=44 ... u mnie działa od D7 do XE10.

Pozostałe rzeczy też da się zrobić w Delphi (nie wiem czy w 2010) bez BlackBox.

pozdrawiam
al

Barbara

unread,
Dec 4, 2018, 5:51:46 AM12/4/18
to
u mnie działa, tylko zmieniłam jeszcze w

private void BuildDigestedReferences()

…………………..

foreach (Reference reference2 in list2)
{
//if (reference2.DigestMethod == null)
//{
reference2.DigestMethod = "http://www.w3.org/2001/04/xmlenc#sha256";
0 new messages