繁体   English   中英

使用phpseclib的Crypt_RSA加密银行的验证码

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM