Golang Java RSA SHA1withRSA 加签、验签

Golang


func Sign(content, prvKey []byte) (sign string, err error) {
    block, _ := pem.Decode(prvKey)
    if block == nil {
        fmt.Println("pem.Decode err")
        return
    }
    var private interface{}
    private, err = x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        return
    }
    privateKey := private.(*rsa.PrivateKey)
    h := crypto.Hash.New(crypto.SHA1)
    h.Write([]byte(content))
    hashed := h.Sum(nil)

    signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey,
        crypto.SHA1, hashed)
    if err != nil {
        return
    }
    sign = base64.StdEncoding.EncodeToString(signature)
    return
}

func RSAVerify(origdata, ciphertext string, publicKey []byte) (bool, error) {
    block, _ := pem.Decode(publicKey)
    if block == nil {
        return false, errors.New("public key error")
    }
    pubInterface, err := x509.ParsePKIXPublicKey(block.Bytes)
    if err != nil {
        return false, err
    }
    pub := pubInterface.(*rsa.PublicKey)
    h := crypto.Hash.New(crypto.SHA1)
    h.Write([]byte(origdata))
    digest := h.Sum(nil)
    body, err := base64.StdEncoding.DecodeString(ciphertext)
    if err != nil {
        return false, err
    }
    err = rsa.VerifyPKCS1v15(pub, crypto.SHA1, digest, body)
    if err != nil {
        return false, err
    }
    return true, nil
}

func TestSign3(t *testing.T) {
    pubKey := "-----BEGIN PUBLIC KEY-----\n{公钥内容}\n-----END PUBLIC KEY-----"
    prvKey := "-----BEGIN RSA PRIVATE KEY-----\n{公钥内容}\n-----END RSA PRIVATE KEY-----"
    content := "模型训练需要花多长时间"
 
    sign, err := Sign([]byte(content), []byte(prvKey))
    if err != nil {
        t.Fatal(err)
        return
    }
    t.Log("sign签名结果:", sign)

    res, err := RSAVerify(content, sign, []byte(pubKey))
    if err != nil {
        t.Fatal(err)
        return
    }
    t.Log("验签结果:", res)

}
  • Test
=== RUN   TestSign
main_test.go:476: sign签名结果: E28UPJoYXDkZhmsIXRau+NI9bk8OsXH85y+IX2LhdQWLpVzHnM2loj179tBNWwElH8bYJPhZE0rJ/5P9tfRozgtCOmkReLkHu/dGbCv3z+6AfnuH/xDqQXgbiO1ZquJFZXUn88ndsO5RgfBUqXCPaovw2k0Fsuv1EtPr6WFcUGk=
main_test.go:483: 验签结果: true
--- PASS: TestSign (0.00s)

PKCS相互转换

    prvKey = "-----BEGIN RSA PRIVATE KEY-----\nMIICdwIBADANBgkqhkiG9w0........KwWPPXMiYR8=\n-----END RSA PRIVATE KEY-----"
    block, _ := pem.Decode([]byte(prvKey))
    if block == nil {
        fmt.Println("pem.Decode err")
        return
    }
    var private interface{}
    private, err = x509.ParsePKCS8PrivateKey(block.Bytes)
    if err != nil {
        return
    }
    privateKey := private.(*rsa.PrivateKey)
    pkcs1 := x509.MarshalPKCS1PrivateKey(privateKey)
    t.Log("pkcs8 转 pkcs1:", base64.StdEncoding.EncodeToString(pkcs1))

    prvKey = fmt.Sprintf("-----BEGIN RSA PRIVATE KEY-----\n%s\n-----END RSA PRIVATE KEY-----", pkcs1)
    pkcs8 := x509.MarshalPKCS1PrivateKey(privateKey)
    t.Log("pkcs1 转 pkcs8:", base64.StdEncoding.EncodeToString(pkcs8))

Java

    private static final String PUBLIC_KEY = "MIGfMA0GCSqGSIb3DQEBAQ......cZ78GF0Nhi2detQIDAQAB";
    private static final String PRIVATE_KEY = "MIICdQIBA......vEG6kp7M716oqd08+e1";

    public static void main(String[] args) throws Exception {
        String content = "模型训练需要花多长时间";
        String sign = sign(content, PRIVATE_KEY, "UTF-8");
        boolean trueRsult = signVerify(content, sign, PUBLIC_KEY, "UTF-8");
        System.out.println("待签名字符:" + content);
        System.out.println(sign);
        System.out.println(trueRsult);
    }

    private static String sign(String content, String privateKey, String charset) throws Exception  {
        try {
            PrivateKey priKey = getPrivateKeyFromPKCS8(ChsiConstants.SIGN_TYPE_RSA,
                    new ByteArrayInputStream(privateKey.getBytes()));

            java.security.Signature signature = java.security.Signature
                    .getInstance(ChsiConstants.SIGN_ALGORITHMS);
            signature.initSign(priKey);
            if (StringUtils.isEmpty(charset)) {
                signature.update(content.getBytes());
            } else {
                signature.update(content.getBytes(charset));
            }

            byte[] signed = signature.sign();

            return new String(Base64.encodeBase64(signed));
        } catch (InvalidKeySpecException ie) {
            throw new DataApiException("RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥", ie);
        } catch (Exception e) {
            throw new Exception("content= " + content + "; charset = " + charset, e);
        }
    }

    private static boolean signVerify(String content, String sign, String publicKey, String charset) throws Exception  {
        try {
            PublicKey pubKey = getPublicKeyFromX509("RSA", new ByteArrayInputStream(publicKey.getBytes()));
            java.security.Signature signature = java.security.Signature.getInstance(ChsiConstants.SIGN_ALGORITHMS);
            signature.initVerify(pubKey);
            if (StringUtils.isEmpty(charset)) {
                signature.update(content.getBytes());
            } else {
                signature.update(content.getBytes(charset));
            }
            return signature.verify(Base64.decodeBase64(sign.getBytes()));
        } catch (Exception e) {
            throw new Exception("content= " + content + ",sign=" + sign + ",charset = " + charset, e);        
        }
    }
  • Test
sign结果:E28UPJoYXDkZhmsIXRau+NI9bk8OsXH85y+IX2LhdQWLpVzHnM2loj179tBNWwElH8bYJPhZE0rJ/5P9tfRozgtCOmkReLkHu/dGbCv3z+6AfnuH/xDqQXgbiO1ZquJFZXUn88ndsO5RgfBUqXCPaovw2k0Fsuv1EtPr6WFcUGk=
验签结果:true
Process finished with exit code 0

RASWITHMD5

  • go
    注意私钥需去除-----BEGIN RSA PRIVATE KEY-----\n和\n-----END RSA PRIVATE KEY-----前后开头的标识内容
// 签名
func RsaSignWithMd5(origData string, RsaPrivateKey string) (sign string, err error) {
    //加密
    hashMd5 := md5.Sum([]byte(origData))
    hashed := hashMd5[:]
    privateKeyString, err := base64.StdEncoding.DecodeString(RsaPrivateKey)
    if err != nil {
        return
    }
    privateKey, err := x509.ParsePKCS8PrivateKey(privateKeyString)
    if err != nil {
        return
    }
    signature, err := rsa.SignPKCS1v15(rand.Reader, privateKey.(*rsa.PrivateKey), crypto.MD5, hashed)
    return base64.StdEncoding.EncodeToString(signature), err
}

/**RSA验签
 * $data待签名数据(需要先排序,然后拼接)
 * $sign需要验签的签名,需要base64_decode解码
 * 验签用支付公钥
 * return 验签是否通过 bool值
 */
func RsaVerify(originalData, signData string) bool{
    sign, err := base64.StdEncoding.DecodeString(signData)
    if err != nil {
        return false
    }
    publicKey, _ := base64.StdEncoding.DecodeString(RsaPublickey)//RsaLlkPublickey  RsaPublickey
    pub, err := x509.ParsePKIXPublicKey(publicKey)
    if err != nil {
        return false
    }
    hash := md5.New()
    hash.Write([]byte(originalData))
    err = rsa.VerifyPKCS1v15(pub.(*rsa.PublicKey), crypto.MD5, hash.Sum(nil), sign)
    if err!=nil{
        return false
    }
    return true
}
  • java
   public static String sign(byte[] data, String privateKey) throws Exception {
        byte[] keyBytes = Base64Utils.decode(privateKey);
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PrivateKey privateK = keyFactory.generatePrivate(pkcs8KeySpec);
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initSign(privateK);
        signature.update(data);
        return Base64Utils.encode(signature.sign());
    }

    public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
        byte[] keyBytes = Base64Utils.decode(publicKey);
        X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);
        KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
        PublicKey publicK = keyFactory.generatePublic(keySpec);
        Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
        signature.initVerify(publicK);
        signature.update(data);
        return signature.verify(Base64Utils.decode(sign));
    }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容