Comments (10)
这个 myasn1 是简化版本的,不能递归全解出来,正常情况是公钥解一次, 私钥要解两次, 这是项目后面加的我写的简要功能, 不完善
array:3 [
0 => "00"
1 => array:2 [
0 => "ecPublicKey"
1 => "sm2"
]
2 => "3077020101042047D278E4FCC62DF9D1AF450ADF9338B684F95467C3EB1F8D2D04D4915D4BC9F5A00A06082A811CCF5501822DA14403420004AB8E37DF98B9DEDF35771D01501596144AA06A80C7E90FE13A3933B373DA9D0F3275403A294F1BF97D95705A7783CDB648C615410ED6088BAFBE0E5A5F33AF58"
]
将那个 array[2], 再解一次就出来私钥了,或者就直接调用
Array
(
[0] => 01
[1] => 47D278E4FCC62DF9D1AF450ADF9338B684F95467C3EB1F8D2D04D4915D4BC9F5
[2] => Array
(
)
[3] => Array
(
)
)
from phpsm2sm3sm4.
有的银行提供的pem格式证书,如何转换成HEX格式呢?sm2加解密好像也没法直接读取pem格式吧
from phpsm2sm3sm4.
pem的base64_decode下, 用 asn1的编码方式解析出来就行了,
我这代码没有做这个用pem文件加解密的,只有hex的, 需要的话,你可以查看签名的那个,有从pem取出明文公私钥的方法
from phpsm2sm3sm4.
base64格式的一串公钥和 hex格式的一串公钥,怎么才能相互转化呢?试了下签名里面的方法,也是出错
HEX格式公钥,是ans1格式的二进制转成 16进制的吗?bin2hex 这个函数转换出来的长度好像也不对
from phpsm2sm3sm4.
$base64String = '*****';
$binaryData = base64_decode($base64String);
$asnObject = ASNObject::fromBinary($binaryData);
printObject($asnObject);
function printObject(ASNObject $object, $depth = 0){
$treeSymbol = '';
$depthString = str_repeat('─', $depth);
if ($depth > 0) {
$treeSymbol = '├';
}
$name = Identifier::getShortName($object->getType());
echo "{$treeSymbol}{$depthString}{$name} : ";
echo $object->__toString().PHP_EOL;
$content = $object->getContent();
if (is_array($content)) {
foreach ($object as $child) {
printObject($child, $depth + 1);
}
}
}
base64格式的sm2公钥转换后的hex公钥为130个字符,但私钥转换完却有242个字符,这是咋回事啊
from phpsm2sm3sm4.
gmp_init(): Unable to convert variable to GMP - string is not an integer
// $encryptData = $c1.$c3.$c2
$adapter = $this->adapter;
$generator = $this->generator;
$this->cipher = new \Rtgm\smecc\SM2\Cipher();
$c1X = substr($encryptData,0,64);
$c1Y = substr($encryptData,strlen($c1X),64);
$c1Length = strlen($c1X) + strlen($c1Y);
$c3 = substr($encryptData,$c1Length,64);
$c2 = substr($encryptData,$c1Length+strlen($c3));
$p1 = new Point( $adapter, $generator->getCurve(), gmp_init($c1X, 16 ), gmp_init( $c1Y, 16 ) );
$this->cipher->initDecipher($p1,$privateKey);
$arrMsg = Hex2ByteBuf::HexStringToByteArray2($c2);
$arrMsg = $this->cipher->decryptBlock($arrMsg);
$document = hex2bin(Hex2ByteBuf::ByteArrayToHexString($arrMsg));
$c3_ = strtolower(Hex2ByteBuf::ByteArrayToHexString($this->cipher->Dofinal()));
if($c3 == $c3_){ //hash签名相同,
return $document;
from phpsm2sm3sm4.
私钥里是包含了公钥信息的,私钥里有 oid, 私钥,公钥, 公钥里只有 :oid, 公钥 ,
我的rtsm2文件 281行有从pem文件里解析出公钥的代码,同理也可以从文件里读出私钥的明文,这个只要操作一次就行,然后记下来
$sigSerializer = new DerSignatureSerializer();
$keyData = file_get_contents( $publickeyFile );
$derSerializer = new DerPublicKeySerializer( $adapter );
$pemSerializer = new PemPublicKeySerializer( $derSerializer );
$key = $pemSerializer->parse( $keyData );
$pubKeyX = $this->decHex( $key->getPoint()->getX() );
$pubKeyY = $this->decHex( $key->getPoint()->getY() );
$publickey = $pubKeyX.$pubKeyY;
from phpsm2sm3sm4.
$sigSerializer = new DerSignatureSerializer(); $keyData = file_get_contents( $publickeyFile ); $derSerializer = new DerPublicKeySerializer( $adapter ); $pemSerializer = new PemPublicKeySerializer( $derSerializer ); $key = $pemSerializer->parse( $keyData ); $pubKeyX = $this->decHex( $key->getPoint()->getX() ); $pubKeyY = $this->decHex( $key->getPoint()->getY() );
$publickey = $pubKeyX.$pubKeyY;
了解了,最好能封装个方法,方便外部直接调用导出
from phpsm2sm3sm4.
示例临时生成的公私钥
protected $publicKey = '3059301306072a8648ce3d020106082a811ccf5501822d03420004ab8e37df98b9dedf35771d01501596144aa06a80c7e90fe13a3933b373da9d0f3275403a294f1bf97d95705a7783cdb648c615410ed6088bafbe0e5a5f33af58';
protected $privateKey = '308193020100301306072a8648ce3d020106082a811ccf5501822d04793077020101042047d278e4fcc62df9d1af450adf9338b684f95467c3eb1f8d2d04d4915d4bc9f5a00a06082a811ccf5501822da14403420004ab8e37df98b9dedf35771d01501596144aa06a80c7e90fe13a3933b373da9d0f3275403a294f1bf97d95705a7783cdb648c615410ed6088bafbe0e5a5f33af58';
// https://the-x.cn/encodings/Asn1.aspx ASN.1解码工具 分析出来是以下这样
protected $publicKeyDecode = '04ab8e37df98b9dedf35771d01501596144aa06a80c7e90fe13a3933b373da9d0f3275403a294f1bf97d95705a7783cdb648c615410ed6088bafbe0e5a5f33af58';
protected $privateKeyDecode = '47D278E4FCC62DF9D1AF450ADF9338B684F95467C3EB1F8D2D04D4915D4BC9F5';
@honghuzhi @lpilp 您好,求助,最后如何解决的?我的私钥使用 MyAsn1 decode() 结果是 242位:
array:3 [
0 => "00"
1 => array:2 [
0 => "ecPublicKey"
1 => "sm2"
]
2 => "3077020101042047D278E4FCC62DF9D1AF450ADF9338B684F95467C3EB1F8D2D04D4915D4BC9F5A00A06082A811CCF5501822DA14403420004AB8E37DF98B9DEDF35771D01501596144AA06A80C7E90FE13A3933B373DA9D0F3275403A294F1BF97D95705A7783CDB648C615410ED6088BAFBE0E5A5F33AF58"
]
而且我将私钥转为pem格式,使用 doSignOutKey 签名报错 Invalid data
,使用公钥verifySignOutKey验签没问题
最后如何用代码实从原私钥获取到本扩展所能使用的公钥和私钥?
from phpsm2sm3sm4.
@lpilp 好的,感谢您的回复
from phpsm2sm3sm4.
Related Issues (20)
- HMAC-SM3 请问这个能否实现呢 HOT 3
- 求大佬帮看看sm2签名,java的可以通过,但是php的签名就没有办法通过,对接国家医保支付 HOT 1
- 大神你好,请问 hmac-sm3 具体怎么做呢? HOT 1
- SM4 golang 版和 php 版本加密后数据不一致,求指点 HOT 6
- 使用sm4-ecb提示Uncaught Exception: 秘钥长度为16位 HOT 2
- 求助SM2解密问题 HOT 7
- 对接招行付款码收款支付,需要对终端数据进行加密,并且在要对随机私钥进行数字信封加密,进行测试时信封加密和招行不一致,加密结果也不一致 HOT 9
- sm2 缺少文件 HOT 4
- 调用CBS8 总提示致命错误 HOT 3
- 对接招行时,对招行的数据返回进行验签时,偶现错误 ASN.1 Parser Exception at offset XX: Integer not minimally encoded HOT 2
- does not comply with psr-4 autoloading standard HOT 8
- Uncaught FG\ASN1\Exception\ParserException: ASN.1 Parser Exception HOT 5
- 对接国家医保平台的sm2withsm3的时候发现,这个签名的结果和java的签名不一致 HOT 7
- 加密无法解密 HOT 1
- Java 加密使用的是SM3withSm2,php生成签名验签不通过 HOT 9
- java代码生成的签名用php代码验签不通过 HOT 3
- java代码生成的sm2解密与php不一致, HOT 3
- 密钥 base64 转 hex 问题 HOT 8
- 对接招行使用sm3withsm2加密,按照示例写的加签方法在招行验证失败。 HOT 12
- 对接招行需要使用SM3withSM2,sm2加密需要用sm2p256v1。 HOT 3
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from phpsm2sm3sm4.