[英]using phpseclib's Crypt_RSA to encrypt verification code for a bank
我需要向银行发送查询,该查询包含指定字符串格式的验证码$ vk_mac。 该代码必须是SHA1哈希和使用我的公钥加密的RSA,并以base64格式显示。 不幸的是,到目前为止,我一直没有成功-银行给了我“错误的签名”,而且我得到的所有信息也是如此。
我所拥有的是:
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents("private_key.pem"));
$rsa->loadKey($rsa->getPublicKey());
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$encrypted = $rsa->encrypt(sha1($vk_mac));
$vk_mac = base64_encode($encrypted);
private_key.pem这是我的纯文本私钥。 我尝试将加密模式设置为CRYPT_RSA_ENCRYPTION_OAEP,但不走运。 我有99.9%的肯定,起始$ vk_mac字符串格式正确,并且包含所有必需的详细信息。
有人知道我该怎么做吗? 谢谢。
编辑:
我已经将代码更改为此(其中vk_mac是需要签名的起始格式化字符串,而private_key.pem是我的已解码私钥):
$rsa = new Crypt_RSA();
$rsa->loadKey(file_get_contents("private_key.pem"));
$rsa->setSignatureMode(CRYPT_RSA_SIGNATURE_PKCS1);
$hashed = $rsa->hash->hash($vk_mac);
$encrypted = $rsa->sign($hashed);
$signature = base64_encode($encrypted);
我可以确定生成的签名是正确的,因为当我这样做时:
$rsa->loadKey($rsa->getPublicKey());
$verified = $rsa->verify($hashed, base64_decode($signature));
$ verified返回TRUE。
银行虽然响应“签名不正确”。 还有其他想法吗?
编辑:
VK_MAC控制码计算
VK_MAC,用于电子签名,用于请求中,用于检查和确认算法的使用版本,如参数VK_VERSION所示。 此时使用的是008版本。 VK_MAC在BASE64编码中作为请求参数出现。
008
使用公钥算法RSA计算MAC008函数的值。 空字段的值也要考虑在内-“ 000”。
MAC008(x1,x2,…,xn):= RSA(SHA-1(p(x1)|| x1 || p(x2)|| x2 ||…|| p(xn)|| xn),d, N)
其中:|| 是将字符串x1,x2,…,xn相加的操作。查询参数p是参数长度的函数。 长度是三位数字字符串形式的数字d是RSA秘密指数n是RSA模数签名是根据PKCS1标准(RFC 2437)计算的。
如果您尝试$ rsa-> sign()怎么办? PKCS#1不会通过简单地加密哈希来进行签名,如果您的银行使用的是可互操作的RSA解决方案,那么它们也可能不会这样做。
该代码几乎是正确的-尽管我不需要再次对其进行哈希处理(感谢@Accipitridae)。
解决方案是商人的ID必须为大写,而不是提供的小写。 它在规范中的任何地方都没有说它也必须是大写的。 尼斯。
如上所述,您可以使用openssl轻松完成此操作。 以下是我的做法。
$hashed = sha1($vk_mac);
openssl_public_encrypt($vk_mac, $encrypted, ($pubkey));
$vk_mac = base6$_encode($encrypted);
有关更多信息,请阅读openssl_public_encrypt上的文档 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.