使用公钥加密密码(RSA)

时间:2014-05-06 13:11:07

标签: php encryption certificate rsa pem

我对我希望简单调用PHP的问题有严重的问题 openssl_public_encrypt();

可悲的是,我收到了无效的公钥警告。

我的目标是简单地使用其API提供的公钥对用户密码进行RSA加密,目前看起来像这样:

  

+ Tir6 + unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW + O / GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE / clA9 / zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5 + DPJ / N24krYvHaYIr8ACxDqBv2TR3E9M = AQAB

显然,使用我尝试使用的相同服务的工作实现找到了具有以下步骤的解决方案:

  1. 从公钥中提取模数和指数
  2. 以MS PUBLICKEYBLOB格式重新构造密钥
  3. 调用OpenSSL将密钥转换为PEM格式
  4. 从转换后的文件中加载PEM公钥
  5. 加密密码(转换为UTF-16LE后)
  6. 然而,不仅我不知道它是否可以用PHP做,我认为必须有一个更简单的方法!

    我看到的一个帖子暗示指数可能出现在最后一个符号之后(所以AQAB),但我不知道这是否可靠。

2 个答案:

答案 0 :(得分:1)

像这样做你想要的东西?:

<?php
$key = '+Tir6+unMOaQ5tHqjjjwnlAMhccnCSMFEi3a0mhIxbW+O/GukjomGyzckQT2h0Ys70JezHbNq5YS3sYkNF29kCkz4HuNfy9eEjE/clA9/zyfT8ZcbnusLcLz2xNgbTp62fQdzBnReI5+dpj/N24krYvHaYIr8ACxDqBv2TR3E9M=AQAB';

include('Crypt/RSA.php');

$rsa = new Crypt_RSA();
$rsa->loadKey(array(
    'e' => new Math_BigInteger(65537),
    'n' => new Math_BigInteger(substr($key, 0, -4), -256)
));
$ciphertext = $rsa->encrypt('password');

echo bin2hex($ciphertext);
?>

此示例使用phpseclib, a pure PHP RSA implementation。尽管phpseclib不支持您发布的密钥格式,但它支持原始公钥,因此转换为PKCS1样式密钥是不必要的。而phpseclib产生的密文完全是interoperable with OpenSSL

答案 1 :(得分:0)

好的,你需要做什么:

  1. 删除AQAB部分,并使用值65537作为公共指数
  2. base 64解码模数
  3. 以PKCS#1格式创建公钥的DER编码(见下文)
  4. base64使用64个字符行长度和DOS行结尾编码DER编码
  5. 添加PEM标题&amp;页脚
  6. 使用PEM编码的字符串创建公钥,最后
  7. 加密密码

  8. 以下ASN.1规范定义了PKCS#1格式的公钥:

    RSAPublicKey ::= SEQUENCE {
          modulus           INTEGER,  -- n
          publicExponent    INTEGER   -- e
    }
    

    现在SEQUENCE的标识符八位字节或标记为十六进制30,INTEGER为02,长度应指定为like this。所以你会得到类似的东西:

    30818902818100F938ABEBEBA730E690E6D1EA8E38F09E500C85C727092305122DDAD26848C5B5BE3BF1AE923A261B2CDC9104F687462CEF425ECC76CDAB9612DEC624345DBD902933E07B8D7F2F5E12313F72503DFF3C9F4FC65C6E7BAC2DC2F3DB13606D3A7AD9F41DCC19D1788E7E7698FF376E24AD8BC769822BF000B10EA06FD9347713D30203010001
    

    以十六进制表示。因此,在base 64编码并添加页眉和页脚行后,您应该得到:

    -----BEGIN RSA PUBLIC KEY-----
    MIIBCgKCAQH5OKvr66cw5pDm0eqOOPCeUAyFxycJIwUSLdrSaEjFtb478a6SOiYbLNyRBPaHRizvQl7Mds2rlhLexiQ0Xb2QKTPge41/L14SMT9yUD3/PJ9Pxlxue6wt
    wvPbE2BtOnrZ9B3MGdF4jn52mP83biSti8dpgivwALEOoG/ZNHcT0wIDAQAB
    -----END RSA PUBLIC KEY-----
    

    快乐的编码。