ASP.NET openssl_sign a openssl_verify
Nedávno som dostal za úlohu implementovať online platobnú metódu GP webpay (www.gpe.cz). Túto metódu používa ČSOB a Volksbank banka. Jej súčasťou je podpisovanie SHA1 hashu reťazca pomocou RSA algoritmu.
V návode na implementáciu sa píše:
Calculating the electronic signature
Inputs: Data message (message), Private RSA key (with a K length module)
Outputs: Electronic signature (BASE64 encoded), approximate length K*1.5
The electronic signature is calculated as follows:
- The value of the function SHA-1 is derived from the message.
- The hash is encrypted into the input value for the RSA signature, using the EMSA-PKCS1-v1_5-ENCODE algorithm as described in paragraph 9.2.1.The following is the encryption: 01 | FF* | 00 | 30 21 30 09 06 05 2B 0E 03 02 1A 05 00 04 14 | hash where FF characters repeat as many times as necessary for the total length of the string to be one octet shorter than the key modulus. The character | is used for the strings concatenation.
- The RSA signature is calculated using the output value from b), as described in 8.1.1 RSASSA-PKCS1-V1_5-SIGN
- The output from c) is encoded using BASE64.
Na toto podpisovanie existuje v PHP jednoriadková funkcia openssl_sign(). V .NET ale žiadna takáto funkcia neexistuje. Nikde som ani nenašiel ako na to. Problém tiež bol, ako správne načitať vygenerovaný a zaheslovaný certifikát a ako z neho získať privátny kľúč.
PHP na tento účel využíva openssl knižnicu (http://www.openssl.org), pre ktorú našťastie existuje .NET port. Po preskúmaní zdrojového kódu PHP a niekoľkých hodinách trápenia sa s knižnicou ManagedOpenSsl sa mi konečne podarilo správne podpisovať a verifikovať reťazec. Prikladám funkčné demo aj so zdrojovými kódmi.
Demo openssl_sign, a Stiahite si zdrojový kód (.zip 1,4 MB).