jsencrypt
jsencrypt copied to clipboard
Sometimes 'JSEncrypt.sign' return a result which is not compatible with openssl.
Hello, thank you for your hard work. I found that sometimes the method 'sign' of 'JSEncrypt' return a result which is not compatible with openssl because the bytes length of result is 255,my key bit length is 2048, the 'verify' method of 'JSEncrypt' works ok. If I insert a zero before the result, openssl can verify it.
This is my test data:
public key: -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3giaOAlxJWRMe0fWcIpu GZnYiqBwdMEEVytd7tLj3/m1ceBIb0fmcMkO6U6le3WAj/XYxV1ZPHQMh9vzzGkV xnNDEZgAOhKTVqvey/zhgXWjVQEYt+sCCASldtm9WNQFZduLbxv+BBZpy1PeUBGS qJD4M3IKpbGWMIKDfu6P7XbMTMQ/Z5oPIYeeTrUc6BK49Eqwwl+LZJisfdu2p4Xr ldh0EMYLM4mzMfXDd5EYEjC6i5utwoaaMoLys8XxL66wvfZ/H68GqvyUvy8k2haS RUZ1SKYUIDCiy4QznJdZk1CHQ/Hmimla57Ur/+vBTZZh+FYGA5iB0us6Uy8slMZ4 sQIDAQAB -----END PUBLIC KEY-----
private key: -----BEGIN RSA PRIVATE KEY----- MIIEpQIBAAKCAQEA3giaOAlxJWRMe0fWcIpuGZnYiqBwdMEEVytd7tLj3/m1ceBI b0fmcMkO6U6le3WAj/XYxV1ZPHQMh9vzzGkVxnNDEZgAOhKTVqvey/zhgXWjVQEY t+sCCASldtm9WNQFZduLbxv+BBZpy1PeUBGSqJD4M3IKpbGWMIKDfu6P7XbMTMQ/ Z5oPIYeeTrUc6BK49Eqwwl+LZJisfdu2p4Xrldh0EMYLM4mzMfXDd5EYEjC6i5ut woaaMoLys8XxL66wvfZ/H68GqvyUvy8k2haSRUZ1SKYUIDCiy4QznJdZk1CHQ/Hm imla57Ur/+vBTZZh+FYGA5iB0us6Uy8slMZ4sQIDAQABAoIBAQDdGFvZaS2OOm4e ZM6YioBQZe5HPLQ+zuVvl/OVmdLoeVPA7cGzbjl+HfgHQxVt9vfqYrlU7zupAzZn IxOGfS39y1EB+AZhzZWCPOtC3bIApA/c2Zavrgj7ywSpcPEnvxkQ8KnMHme30knO +tjpilYsHQ/KysjnbgtMiuo+P3h60HKLu98O71AVqKMpF1YTg0wU8PJp9+4Jkf/V AMF5o8TNubQfIOriD52irkP09hPnpo3dSldd0EBBPdSnw8b+SxJ8Lb0hZkFEfs9v EuTJp50KnO4GJ3qUkquUcEf20ZETwCKvVGe8TpXTZg4ot6t8Zl7Q8y6H2KveocBh 0+TjuhgBAoGBAPGokfbOG21AQq45dB5fqFF0biH7wL7R2ZJpluDuSk/VbHHzcrwn 6jX5FxfDlptHhYjmIZ9bAaN7Xulh7KBRlgo7OQMmcMYhSuvSnt7/Pd5hOvqO8udE 9gmdxp4o/qmXVd0UpjpYJrXxDQpDE1jLR3bflyIs1yl+knZ8X7oqwxiRAoGBAOs1 4O4ZHdqFXSFYoyUvPOLUluBLl9EKD7OSwJyxWd3uRvBNSfr6Af+7R13w6iZPtCnN LKZLHrpspaMmGbeKuLJILiAbD1NHJdY/i2i/60U2fmX8QW1825qcLMjwAUjbeml6 ETIV5b6sZC7sSbp6nMPPEXVgosutZyhXlgHE8m4hAoGBAMHoPG9oxLMubBL2wQka QqpRnYmhQ/EZ29ZS6aFFM9XJcEIjUX5PHO0AGZqU88VXZ3wJBROkZ7UxamAklkWy EY3WJZI0hytETaTalWZkMtW8+SFSEPCn8jCXLGd+h5G3gEtspVGNqEo3yPniBqUq QAbPtKrUhjWifY2bkQiGBZQxAoGAWHjEqWqDIy3k0OUxQIxbH4sNUUK90SAytb3u e0HuZp74yeyYdjHRzKpZ9sjmmhCC2PJW6Bn7be3uA8cSB0rDnDOwPd1Pz2hEoCj4 vCbsTPVpZ90RkyhSxf4WjmJQaWI80i3bB/bamvTnHgs81ErIapKZo4f81BXeZntD bljxQ2ECgYEAse+yfio2a/ospDTw1Gz52eJCSM7Zq/6kcOdBiD4qbM1lTjBNy4Xr k8RgmGciMABpTRa/2NAoJQawTwSwYRIbRaZ8eOEjBhWnKBMLsZhr41RZyaYozuxY C7VKfKbXzkOXLTgofsXWvcYFRofb4Er4oY56FOPapcadIuvTkwBi/Hk= -----END RSA PRIVATE KEY-----
test data: '72ca98f112c1fae0344327001c7c7d9d01cdf74dfcd1c89e6f6223'
signature: "dLyJd7D3VVPKCupAlY1Qx1DU4yDLholpDI/TcqTUpfmrsZi+EGPNjjOkIDAl7nfSX9JtD/XEOglp+dg4lYOVOuVDbn6pl+mBZSDp/5H081Fg3J7J6TWETUPa++5i5juC7L4l3r0fzUlzgL+9ISq2tmOEV2sbh65zxItCQaPWIuhh3yQ09wFQfzYe8qCQNFt2mD4RTDdzH86Xr7w/m1KCWUv/zNEY6vQ2r17Msxlp6Zo4kfFy3dIZ9yhuPidOB0heB1PlasZgi7RooflDfUq7GrD9htQepRByCAK3HSH0tz/yJDeSWQ9/nfXiFBrAyW6KQm9PRZ2D3qsSnGGo943d"
@omega4github , did you find a way to solve that? Could you please share it with me, if yes? I'm experiencing the same issue
@omega4github , did you find a way to solve that? Could you please share it with me, if yes? I'm experiencing the same issue
I copied the padding code from method of "RSAKey.prototype.encrypt" to "RSAKey.prototype.sign", it works. the new sign method is like this:
RSAKey.prototype.sign = function (text, digestMethod, digestName) {
var header = getDigestHeader(digestName);
var digest = header + digestMethod(text).toString();
var m = pkcs1pad1(digest, this.n.bitLength() / 4);
if (m == null) {
return null;
}
var c = this.doPrivate(m);
if (c == null) {
return null;
}
var h = c.toString(16);
var length = h.length;
var maxLength = (this.n.bitLength() + 7) >> 3;
// fix zero before result
for (var i = 0; i < maxLength * 2 - length; i++) {
h = "0" + h;
}
return h;
};
The core logic of "encrypt" and "sign" is the same, so I think this is ok.