Skip to content

Instantly share code, notes, and snippets.

@larryli
Created January 9, 2014 12:15
Show Gist options
  • Save larryli/8333213 to your computer and use it in GitHub Desktop.
Save larryli/8333213 to your computer and use it in GitHub Desktop.
RSA sign/verify
package main
import (
"crypto"
"crypto/rand"
"crypto/rsa"
"crypto/x509"
"encoding/pem"
"errors"
"os"
)
var privateKey = []byte(`
-----BEGIN RSA PRIVATE KEY-----
MIIEoQIBAAKCAQEAgwaTUmUK9BxxSFjDNvD+zOlJlGZTgucF6aFQWmtc7UBGdRpr
fH7Bs+/Gvf2wAbNJAcwLF3DVEl4uP4rqatRkCQLLUwsag4haJ/QhACP9XCxNqvBh
3Z6HowLgQvQ7PXGiIVsrqs11HhEzpq01aMxuBuDnujZ/+j1cO2ibnsbL99hXAPW0
LRicUEvHzPtduRvzKBaeHosnVaHYS8l7Yf9ExdmP7dA9vOqnDjJ0nxzQ6NAIbyi4
kDgUjn14HFqUnkCVqmtyMr6Haq1BZx0oH0V35dW3Ew1hu1BLAvZcNJB7LQHOLeKF
vmUA9Euwypho71ZH2NYDATg07JK4g3Tj2k0ggwIBJQKCAQBxUcuFh9IfOzGKraHq
U+NJb9DvDGPm1aQ/rhv7LGwLddwSQFz2DMMz1ksFLm61XMmFA3823iAP4sA29K8Q
SPySK+4eTsrSn3CRQddaEUnTLTxAz+XwGmd4Oda2cly/hN8/cXHf1Emddqk2NO/r
7xMM3jAyWKYI2x9V+ZtY40ie/wXpBHjuSOJvJDcif8x+moZ9OQpg+fvf9H0Oekxv
MDs4QEs6cHawGYUZr7R5S1XrgWLTWPfaEqvZ1mSNcavoB/sCaixBc5vBlf8SUpfS
IkuFo0IUQRwjzt2ibU1BA1F0V4RP2DGNkU9bVV2bwgPkz0/1hQagvfmtx2WpJxzy
/3WtAoGBAObnPFc168sSWT4EJhZcxpbLl3yY06AsxaWgFcbUMvafFehlHsz0atzK
smG+oqSXh1Gs0ENsZcs1y8egI7h+/aZlF+eHJEbXcZHq7q8geUzd/kskdThHc/3f
EEwJX5OwtBbxv8xJuzgESuR1ucj6GVZW2WLR86eON27wLZzDZHILAoGBAJFETDEj
qIttcKoI8YLp8rDbtS2Flnvt6YIS9kwtPImtuVCNH2eM4khdzOo0OxD4+xx9+ZaP
rLKk0cw4q21a+bUKiMd/7JR7ZkCO/vlz1IO1UqeHLODqdRzgF67YBRFNyIY/0MAo
+cUuZhgYxkt0rT0OGtCFaOStbLwHsg2d8U5pAoGBAKh/Od7Ge6IGeHlc+TLpwVlI
dXaZCSHbe3jcmkT7tnydml16ORIaJHea1TKSB/uRK2UdPgev90FC7qZt8I2NGfX2
vmquuZt6nvvHHOCo/pIJx2dEHi/8ykOixrQG1wrousSikuEu4pCpL7t4gKdqZYQx
ieBUBNQ3WOJAj/zF71ojAoGARquasB8vZmyXrKpnp3i7QUhKTX9CSiC2yahcJQ8W
iCsANQZiTg0v0C2h9WWEhMwnIp4mZOvzJnmyK//ksb2OPGX9WiKOxMZpGHzqvotg
d2z3xx8qlu6Z1rI1CPN4FkGEJaKBOuOAbcOLnQUiMovJ5lnjiAmM+aB6Fkju1jEp
SL0CgYA/NVZe5W7VbC0HxHGA8KyuSiqY3uWrXiE+jHMNFNtSi5LhR0a9gaxrxa58
hTh6REbOCFcQjX9OCx65RG+wn6X0katVFu+x1R+kZ7A1dGbOthXisocLHN58Cjf3
EsWDR34yF7Dr4h0NyIzQ6UmeKHZoXo+tJ0wOq8gl5uN52uCXSQ==
-----END RSA PRIVATE KEY-----
`)
var publicKey = []byte(`
-----BEGIN PUBLIC KEY-----
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAgwaTUmUK9BxxSFjDNvD+
zOlJlGZTgucF6aFQWmtc7UBGdRprfH7Bs+/Gvf2wAbNJAcwLF3DVEl4uP4rqatRk
CQLLUwsag4haJ/QhACP9XCxNqvBh3Z6HowLgQvQ7PXGiIVsrqs11HhEzpq01aMxu
BuDnujZ/+j1cO2ibnsbL99hXAPW0LRicUEvHzPtduRvzKBaeHosnVaHYS8l7Yf9E
xdmP7dA9vOqnDjJ0nxzQ6NAIbyi4kDgUjn14HFqUnkCVqmtyMr6Haq1BZx0oH0V3
5dW3Ew1hu1BLAvZcNJB7LQHOLeKFvmUA9Euwypho71ZH2NYDATg07JK4g3Tj2k0g
gwIBJQ==
-----END PUBLIC KEY-----
`)
func sign(data []byte) (sign []byte, err error) {
block, _ := pem.Decode(privateKey)
if block == nil {
return nil, errors.New("private key error")
}
priv, err := x509.ParsePKCS1PrivateKey(block.Bytes)
if err != nil {
return nil, err
}
hashFunc := crypto.MD5
h := hashFunc.New()
h.Write(data)
hashed := h.Sum(nil)
return rsa.SignPKCS1v15(rand.Reader, priv, hashFunc, hashed)
}
func do_sign(text, filename string) {
sign, err1 := sign([]byte(text))
if err1 != nil {
panic(err1)
}
fo, err2 := os.Create(filename)
if err2 != nil {
panic(err2)
}
defer func() {
if err := fo.Close(); err != nil {
panic(err)
}
}()
if _, err3 := fo.Write(sign); err3 != nil {
panic(err3)
}
}
func verify(data, sign []byte) (err error) {
block, _ := pem.Decode(publicKey)
if block == nil {
return errors.New("public key error")
}
pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
if err != nil {
return err
}
pub := pubInterface.(*rsa.PublicKey)
hashFunc := crypto.MD5
h := hashFunc.New()
h.Write(data)
hashed := h.Sum(nil)
return rsa.VerifyPKCS1v15(pub, crypto.MD5, hashed, sign)
}
func do_verify(text, filename string) {
fi, err4 := os.Open(filename)
if err4 != nil {
panic(err4)
}
defer func() {
if err := fi.Close(); err != nil {
panic(err)
}
}()
buf := make([]byte, 256)
if _, err5 := fi.Read(buf); err5 != nil {
panic(err5)
}
err6 := verify([]byte(text), buf)
if err6 != nil {
panic(err6)
}
}
func main() {
do_sign("foobar", "test.dat")
do_verify("foobar", "test.dat")
}
<?php
$publickey = <<<EOF
-----BEGIN PUBLIC KEY-----
MIIBIDANBgkqhkiG9w0BAQEFAAOCAQ0AMIIBCAKCAQEAgwaTUmUK9BxxSFjDNvD+
zOlJlGZTgucF6aFQWmtc7UBGdRprfH7Bs+/Gvf2wAbNJAcwLF3DVEl4uP4rqatRk
CQLLUwsag4haJ/QhACP9XCxNqvBh3Z6HowLgQvQ7PXGiIVsrqs11HhEzpq01aMxu
BuDnujZ/+j1cO2ibnsbL99hXAPW0LRicUEvHzPtduRvzKBaeHosnVaHYS8l7Yf9E
xdmP7dA9vOqnDjJ0nxzQ6NAIbyi4kDgUjn14HFqUnkCVqmtyMr6Haq1BZx0oH0V3
5dW3Ew1hu1BLAvZcNJB7LQHOLeKFvmUA9Euwypho71ZH2NYDATg07JK4g3Tj2k0g
gwIBJQ==
-----END PUBLIC KEY-----
EOF;
$pubkeyid = openssl_pkey_get_public($publickey);
if ($pubkeyid === FALSE) {
die("public key error");
}
$fp = fopen('test.dat', 'r');
$sign = fread($fp, 256);
fclose($fp);
$ok = openssl_verify('foobar', $sign, $pubkeyid, OPENSSL_ALGO_MD5);
if ($ok == 1) {
echo "good\n";
} elseif ($ok == 0) {
echo "bad\n";
} else {
echo "ugly, error checking signature\n";
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment