php 签名 验签 pkcs8,PHP和Java的RSA签名和验签
发布日期:2022-02-08 20:24:00 浏览次数:33 分类:技术文章

本文共 7226 字,大约阅读时间需要 24 分钟。

Java:

1. 生成签名:

package com.sign.demo3;

import org.apache.commons.codec.binary.Base64;

import java.nio.charset.StandardCharsets;

import java.security.*;

import java.security.spec.InvalidKeySpecException;

import java.security.spec.PKCS8EncodedKeySpec;

public class sign {

private final static String PRIVATEKEY = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCJTUlwC3FX5jvPKTheJNAOnS6RzMi4Hogh+W9qXc2sUO4XwSCHgJ/rY5C326ASAfB6RjyecGWEZKQyqunMWDBsJJ7DON6dbh9JhPd4IO6zK/uKXGugy0vZ9LH4hKUuIzhNCNygnu2I3lyzCN7eyWe+b5ZUfEp9yaHB12QqOt4FXbWmSL7mFfM88cqM7ctmYCLoR1JbvUsX8RzJmOh3WAx2Qx5bFgHidIhGk0dv+61Atk/JFVkooz9m2gJ6kw7l33SenS9lghMOfKgxH4RvUxf0m5HQqFV4zVcwoJvLWB2hZ/bGgIaT4o71qHzeuIp3x1Djhxs4Dv0g9/Lvy0j+6q95AgMBAAECggEAezvZPC2pD6Hf8LIom6ci7tr5X3eUeF0/Bm9hJvEGlzEUYlG/Jp+16Yo17C+93ivLcZP0+KgdFdVW4vswWW6WF5pOvR4gAOFER7KGg1XbqQlC/g6xs2KEtB3CVzKHJ4AJGmtnyuqafIxIW5EMqJ3Q9cYmAbKFEZ2WB+uRRa4MdHc09ExoFLGkU3iA1GjScTpo4G/VbSoj2pCRrWGgA+sZ8tTfc2kqeEKpsPL/4rpI/MNYQha54CSKN7A1YykgLfa4T5Jjkkmu5VjE/iK1/Y+O7+EL8RK2/XjWDkHznQaHhurr+cFTYt+VRYo0eChWFmg2daoNx88LMkJ6ShnjDr3NWQKBgQC76kgHKZqiubcxU9m2SewGGPI+I+VdKiybKMX8Rc0swmGM0Eera737gy0NvWRTauUDIcSb5FqC7+Zo9Ql51Zcuo/rUkrLskmm8ZpvCsd7tgoSYJjoeqO/p8ZNpMCmTtgFqYSmQZEZL0ds9RmIJ55cSCHQRSeODbsHMLwdDPXu4CwKBgQC7DHerA7xW3t0G24A2G9B/rXGV/mo1TOTttXS6ZgzayPoCPkjS+uzj+zdthhX0g3KyjDcARtvYQZn8KSGR1GA8Ih9KTwEbgRAZcxLERZTFCQDyFXaqZz2r4scsOMMyIZClmbCgrL8xEt2YTFrufFUzLNtnXu3zFGEUBxYdnq61CwKBgDjHT0Aqx/iHGN0kstGrgE9PVlKEUhdWWOgA5+GTzazKhuMfQ6h+A4dtWT2fjiLOV6gcmeVomBicGAh6kYRojyeekHmOYdWtX5l3f3TSfcNR/nJiiokdDnCnd5z+2nExOzhDZ2WjhsH+BLp8+752ZWUjfL6EjuP1oUTqqM0eVLWFAoGAfOx0t/jEvtgVklDjLkAhXkR+igji8joq4z+/eAZUK4LyxrDGfnIr6I+Nk05sN2PbJLhUu5CXn7UgnLLzwquuojq/3ycovC/Uisq6C+/UzkuXIBeJq4FMRRIup7A5Xa/hJViiCI2XG7VX3jGQwZq0ZHtfBYj3LtO7il65PIsQb8UCgYAX7UlsIGPtjFR30RRP6RXoJs/XUnVs8khlPVN5xwYXf1HVlgAs/yMso7s1V5eyCqOAh6vqNJ3dM94sHTSF/9MY68hUQbkGykhdkqriZSmpQrWLZ4lj4xuk/8IeFzvrjYk2TKWGT30He87A0Jh0muc+uKIgVKi3QfoWi4fzsc4MWw==";

public static void main(String[] args) throws NoSuchAlgorithmException, SignatureException, InvalidKeySpecException, InvalidKeyException {

String data = "hello";

byte[] keyBytes = Base64.decodeBase64(PRIVATEKEY.getBytes(StandardCharsets.UTF_8));

PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

Signature signature = Signature.getInstance("SHA256withRSA");

signature.initSign(privateKey);

signature.update(data.getBytes(StandardCharsets.UTF_8));

System.out.println(Base64.encodeBase64String(signature.sign()));

}

}

2. 验证签名:

package com.sign.demo3;

import org.apache.commons.codec.binary.Base64;

import java.nio.charset.StandardCharsets;

import java.security.*;

import java.security.spec.InvalidKeySpecException;

import java.security.spec.X509EncodedKeySpec;

public class verify {

private static final String PUBLICKEY = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiU1JcAtxV+Y7zyk4XiTQDp0ukczIuB6IIflval3NrFDuF8Egh4Cf62OQt9ugEgHwekY8nnBlhGSkMqrpzFgwbCSewzjenW4fSYT3eCDusyv7ilxroMtL2fSx+ISlLiM4TQjcoJ7tiN5cswje3slnvm+WVHxKfcmhwddkKjreBV21pki+5hXzPPHKjO3LZmAi6EdSW71LF/EcyZjod1gMdkMeWxYB4nSIRpNHb/utQLZPyRVZKKM/ZtoCepMO5d90np0vZYITDnyoMR+Eb1MX9JuR0KhVeM1XMKCby1gdoWf2xoCGk+KO9ah83riKd8dQ44cbOA79IPfy78tI/uqveQIDAQAB";

public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, SignatureException {

String data = "hello";

String encrypt = "aaWR/XRf5OPr25mEIvV/YWB5bLUxGyvUuiN7QQmjB2ZWW6Kai44mFzMybEnH4w5fIlbGHtg7z0cTqkGEct04gdPrwwgy6pfg+4Oy6sBvuv4cFcfe827rJdI1G8sEus9EwwkyKrAE5au9VybBq1/n/Y3f0F0O8pIj26p9KtBK187jch0ezubMLhRmxdCIlS5CadGxDEvtwNHMophPO9UOrV5FMv46sD64SdA/PK+9rL53mCaszyGUgCBD7kPPi3mDPrV1xwiImASYkzqpgE8V/o39bWhb0+lE3GxqZVjE5el64ApqW7rOrUOaQevE8iEDyo4x1lC4S3Q/4FZs/EMjYA==";

byte[] keyBytes = Base64.decodeBase64(PUBLICKEY);

X509EncodedKeySpec keySpec = new X509EncodedKeySpec(keyBytes);

KeyFactory keyFactory = KeyFactory.getInstance("RSA");

PublicKey publicKey = keyFactory.generatePublic(keySpec);

Signature signature = Signature.getInstance("SHA256withRSA");

signature.initVerify(publicKey);

signature.update(data.getBytes(StandardCharsets.UTF_8));

System.out.println(signature.verify(Base64.decodeBase64(encrypt)));

}

}

PHP

1. 生成签名

function format($key) {

return '-----BEGIN RSA PRIVATE KEY-----' . PHP_EOL .

wordwrap($key, 64, "\n", true) .

PHP_EOL . '-----END RSA PRIVATE KEY-----';

}

$privateKey = 'MIIEowIBAAKCAQEAu92VMujU1Ioira8UcluIUdIkD14Gpt37f2YKdn/aht8Ni2xr2ub61gaeYeY/TQfveuGA5ga4tXjRYWBhdfFt6OQ1XgEAB9lYhXolR0lepGP0sOjSVUjd+2w72ZPqlzZW9OAce/rr46jC6vfK/Caql53AGelZGXkWzLT/Jk83sjKzyRsAjluNxCKkBXuKPg9AfxV2Aerkk+DzIGWPjqIN1GvgDhxUHJ/xUmO7E9idVZGu8lHYGL00cEfcwfWGwHxumKnz9LLc93kc3jyIA2yPrD9BkLvNMzaVYyVxRq+rrusosuIutG0qwS4B3eRmxUciFUlg1w+e8vZQu3VZlZGCBwIDAQABAoIBADdmKl8u5cQfUAajwIXQlCx8qYGWmqOOhmGVN7SmE0z+bcIVoOCWiJWgsgfwm+4dTvOPmDE8/i8Vh7kNcPAU1/J7iXlFFjs6Tq5dzKxu6GfVygx5O71GlZ9U1Xld8ynQLmhbxkqRPgqOc5xSohslU90N+d4qP8oROTX4kd08MxJq+9wJ6Sq5QHVrKW/P2fjNtRTGDXzHYrhqGIFn3ZtypbklGOYDEwqYDT4zPYBjOXaxFMkomX+bmDdjPzW9i+1erRsRi0QFJwot767FFE+ANknBZcbckYjQWb/K0fyHTJOnAnTcCo2T86sZV9y8/3V4gB9I2+dLAwNlDDfSiqdIztECgYEA3c5o217i7mKCmN2s+u12gXCLDNI8tQ0obDClSq/ofQSlLUIfhZeCnDRZ7XP6RDucutKtevyByqS4bVLYT5e7B5M91ABtl8gNXnwfc15CM4sBA8/hd/7Bk9fOGv7hMyuzhz08eJkRWWPajQI+QEKxZz9OataiMg5c36XgYy79cGMCgYEA2NOzlh2pl5Vlqyi+WV3mek01J1Bp+Spot/Rvc9nSAMXiK7+QEPfkuDJ1NYH5nHJ9FKCJpndTjPAnaqb6OQ32l/u3psFfUzw6/629j0yX1Lm9abOTTOT0Izb7AzUqQPHNw5WC9egWoOv583dPMsvq4hMWEuc/RVV1Oy+4YIh/Dw0CgYBqKOuo6z5ECGQnVBoBs3v/seTriwhBQ33wYkwKdi0ZAQspoTdDEmQR7UCJVPQYikuWY1Viws5ANhyLPpaHacC7fG6gNGA/wCEd8tx+tEONNd+TeoCYlRcDcsuTwh/5BNaVSOrTcbeLCC7HRKaUzRbpqrQWkInq2VL8PAEsl4X3rwKBgQCDPYCR+FpSegcT1pGAnimHFXx6012Rh23jCnz7bniCJ0SCnmyhGKrEIyZ2wLlJTLMQ7SrkK43S3Pm+wFrsddswmxfKQ3ljdC1x3MPEHOQ5ykMv25XpERwExJ6ijmeI79NP8wtVtKkdtjeQekLhyDPfqxXNU1MksFlI/dVn+LaPcQKBgBPe7+NFNx3xqCsLxiujWIci0lt38TlxM/lVPLXzFc+MaD9WaJGaSeR+ATjeO2jgUggyrz/2W+URurj436T0V16eQED+SguB+dggewRrMpkQ/IGLW6fxam8cNBC/U7cxwLBLoXA34clgBs1AR1NgGwKgRChHtSJtjhi6qog+F8vQ';

$data = 'hello';

openssl_sign($data,$sign,format($privateKey),OPENSSL_ALGO_SHA256);

echo base64_encode($sign).PHP_EOL;

2. 验证签名

function format($key) {

return '-----BEGIN PUBLIC KEY-----' . PHP_EOL .

wordwrap($key, 64, "\n", true) .

PHP_EOL . '-----END PUBLIC KEY-----';

}

$data = 'hello';

$sign = 'aaWR/XRf5OPr25mEIvV/YWB5bLUxGyvUuiN7QQmjB2ZWW6Kai44mFzMybEnH4w5fIlbGHtg7z0cTqkGEct04gdPrwwgy6pfg+4Oy6sBvuv4cFcfe827rJdI1G8sEus9EwwkyKrAE5au9VybBq1/n/Y3f0F0O8pIj26p9KtBK187jch0ezubMLhRmxdCIlS5CadGxDEvtwNHMophPO9UOrV5FMv46sD64SdA/PK+9rL53mCaszyGUgCBD7kPPi3mDPrV1xwiImASYkzqpgE8V/o39bWhb0+lE3GxqZVjE5el64ApqW7rOrUOaQevE8iEDyo4x1lC4S3Q/4FZs/EMjYA==';

$publicKey = 'MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiU1JcAtxV+Y7zyk4XiTQDp0ukczIuB6IIflval3NrFDuF8Egh4Cf62OQt9ugEgHwekY8nnBlhGSkMqrpzFgwbCSewzjenW4fSYT3eCDusyv7ilxroMtL2fSx+ISlLiM4TQjcoJ7tiN5cswje3slnvm+WVHxKfcmhwddkKjreBV21pki+5hXzPPHKjO3LZmAi6EdSW71LF/EcyZjod1gMdkMeWxYB4nSIRpNHb/utQLZPyRVZKKM/ZtoCepMO5d90np0vZYITDnyoMR+Eb1MX9JuR0KhVeM1XMKCby1gdoWf2xoCGk+KO9ah83riKd8dQ44cbOA79IPfy78tI/uqveQIDAQAB';

$result = openssl_verify($data,base64_decode($sign),format($publicKey),OPENSSL_ALGO_SHA256);

var_dump($result);

转载地址:https://blog.csdn.net/weixin_33132553/article/details/116151441 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:php实现维吉尼亚算法,python实现维吉尼亚算法
下一篇:php 获取子类常量,PHP中的抽象常量 - 强制子类定义常量

发表评论

最新留言

哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月26日 08时16分30秒