2

I have two short scripts and a (sample) private key that are not producing the same results.

secret.key

-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAxgVbpGebnqyq09U282gWcKqM/XXUqfszvaEoejmJQ0rS0Xx+
OvxU24aNbqB3G+TLIqzJp5O0Ei430kjZyWVvaIKbVr/PGpBBEiMvOANAQnFy3GOC
SQdpxFzE/2j1X2mvS/orhZ/lk7zabU3f4uI25XE90Y/hBZG/jKh9No0W/CZk6iE2
L0Fvy1JXhOSxoOORbIcMhCr9kaUJFXLx2kv3LbNIwP8a/xTszN9TvFKb61uYIpUk
JRuuXPcFREIZuu7tTMWdJI7QPf2LZOLNHkEydGIHM0jygREx9diG77BGiSYHWyxu
lodxN8dld3Ol/NEW5HCJbcGVqbf10HMXnSvJVQIDAQABAoIBAF5s4aVE7pU8ev0m
V9y7zq+M9ExMqssfiS2sspON6iFXha31MnBIMOK5h6mwBPwdHqx7PnGVYjGlLmMs
8AU0RGrOlOpJ7qUZEp5mfraz/ilw1be4D8FpMos7PYkZcKA90iRlt+kxNRU84d9r
Wg5jlo/UbwkGFeRE+tVE5uhjYQl9IlolWl/8HFAMRJj9Qkr3XLy2NXQqD1TfMQkA
KveHaJLhGDOCQ4nkrkDWBuI5qK/As26QBeZY5kKp/O48MHKdC52EkRMjDN1WYdL7
hmAKboN16zfh7j96HvZNYLIMA9IlMq5ngh2Uq15TiNR5ekWdE1zMN23wldLFIRJd
Z23o0qECgYEA7s6HJGiAgw46NnDTJL1KQLDubAtJ8DBhDNZIlysJKPz7d2jNTqkG
13MiX3IrjAdH52FvVtXCgryTjnGvIOxyFFqTPU3kN6gujqMGAR3J3vsoucJyzRQJ
AwR3/Be9yfQ4VF2V8KYfTkkuF+TkyVyZ2/+24v/kTruJMWYmd3sQNOkCgYEA1Eca
NWISu7OclZZeFVyPmB1wUnengmp16iyX1krPkC9HbSvGbb6vsFWALIHq4MsSkyns
qSxUjbGB2cKyke2cvGr3ULX43jppSzThO98rFL35OrdRJvqfhapTz/p0A/cdUbVx
EV10+0SF1HlVSthNPc+NkYn4WDIXs1sh7HYWXY0CgYEApe731IKQmX/vTxjCfgrR
Z3YJlSWa8LyNEwBqXC/ZI5P1n5lA32FvkZE81xlbzObaPZpkZPAPQgyKczXnPHdP
JXlySeyvoUTJZO8+ItRyCvB18e19G6bKREB8prxQcd2yrlyA7UBhDGKpFo1Ds+8W
MdnTWJP6LgL9Z0fVfrwSHNECgYEAhBn7ZV0y6zxLJYv94K1JbxBi5e8wfyhhWOmH
VAQaR1Ak0vt68LDKBKIwsYHn+Rxm4s4kSOMde1ALzsgq+EU2VMr8PW4BAcq32+V8
hRXMaYwPnUqXZfpxa20j2zmxGQafaEnRo0zVj8iEwEUBnyIcb2rKXtfNhJUnyqXb
5ptWL8ECgYEApsy8xdrXeKrd81CfWsBqoefC8/zx4Rj5CMLs2juE21TUG4B6mvOT
atxGV8ClpILPY6NVhCdhly8MAwkDxVSMfQ+xtDMAoW1QDkudx8ICsJRtckCwTyJI
D8WarpJvtYcPLvuBvfQgbAFhThS84yQmTiDMc185v/+P5X7Y7ooYpr4=
-----END RSA PRIVATE KEY-----

sign.py (https://repl.it/@DevinRodriguez1/JumboOlivedrabOs)

from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from Crypto.Hash import SHA256
from base64 import b64encode

digest = SHA256.new()
digest.update("This is a string!".encode())

key = open("secret.key", "r").read()
rsakey = RSA.importKey(key)
signer = PKCS1_v1_5.new(rsakey)
sign = signer.sign(digest)
signed = b64encode(sign)

print(signed.decode())

Produces g8gdQsV1XNqTLSZ/cqo961DN//wfEEYMOjQDiFJ4tBfznBHPmun3y3opINVNJHBl48jxWmP42d4fxzLuF4OScwF6KV3aDjKZ8SUmjs8V/1Wp+2Oxh3ukeifMHgt0C18j7gc2E5JUblpRJc/pVt1PrD66iFwdYPWzrsZYbeV3xZtLk9smJIrS+AGHTYyoJRtRp4beK+Ir82HyB+sDNt5lQcrXYsj4lqU7yBfwmWlEHt/ptI1xisv1SHCnHFms6YpbVfxOhicHf5P+FOYrwSyQPQUTtgeswVYScnB8mmBUbH+e8j7Eh3k++lAfZY89l9xB7fQLpTrgylKFHGEGaS+l3Q==

sign.js (https://repl.it/@DevinRodriguez1/LooseWrithingStructures)

const crypto = require('crypto');

const readFileSync = require('fs').readFileSync;

let private_key = readFileSync('secret.key').toString();

let digest = crypto.createHash('SHA256').update("This is a string!");

let signed = crypto.createSign('SHA256').update(digest.digest()).sign(private_key, 'base64');

console.log(signed);

Produces pKJQTqOXJPK60xWzzMhR2h1FtLust7Hd5iy9FvlPUIPYrH0N6U+9xv+AnKSRDdaOcLeAfmpZN7Y2Zkvv15Ai0yB/D5K8LZFz9Jgk3w+Tim5+rIJX1590tAu9mWfeN0JCsSFCVYnrNLEKKKwBDpStnx9NKj+oKPs2lSbtUh8fOFHboleN8U0wAvF7rmlZn0W8v+rZ5HnwJ9pe4FxPLjznw8r7iTEh2z/r/6mUGDJNPS7U2i32fbsX9tOYaU7Ce09T29Mi7Wq3vnAnnr9LffpIBXMMgEIda3svURJODWAXIg5eAXJ0393C36qM3RMY68rWYdT1s9jYfzuELLNMJr1ENQ==

I have tried a dozen modules from NPM that have produced the same signature with no luck in matching the original signature from python. What am I missing here?

Thanks.

Devin Rodriguez
  • 1,144
  • 1
  • 13
  • 30

1 Answers1

0

A secure RSA encryption is implemented with an appropriate padding scheme, which includes some randomness. See PKCS#1 or OAEP for more details.

The RSA encryption encrypts message padded with '0's and a string of random bit. In the process, the random string is "hidden" in the ciphertext by cryptographic hashing and XORing. On decryption, the RSA decryption recovers the random string from the ciphertext and use it to recover message. This is why you get different result with for the same text message.