facho 2023-10-16 20:54 采纳率: 25%
浏览 4
已结题

php怎么用rsa模数指数加密?

今天搜了个python的,怎么用php实现?

import math
if __name__ == '__main__':
    # 实为16进制串,前补0
    e = '010001'
    # m也需要补00
    m = '94dd2a8675fb779e6b9f7103698634cd400f27a154afa67af6166a43fc26417222a79506d34cacc7641946abda1785b7acf9910ad6a0978c91ec84d40b71d2891379af19ffb333e7517e390bd26ac312fe940c340466b4a5d4af1d65c3b5944078f96a1a51a5a53e4bc302818b7c9f63c4a1b07bd7d874cef1c3d4b2f5eb7871'
    type = 'big'
    m = int.from_bytes(bytearray.fromhex(m), byteorder=type) #字节转换为十进制
    e = int.from_bytes(bytearray.fromhex(e), byteorder=type)
    # js加密为反向,为保持一致原文应反向处理,所以这里原文实际为204dowls
    plaintext = b'123' #值
    # 无填充加密逻辑
    input_nr = int.from_bytes(plaintext, byteorder=type)
    crypted_nr = pow(input_nr, e, m)
    keylength = math.ceil(m.bit_length() / 8)
    crypted_data = crypted_nr.to_bytes(keylength, byteorder=type)
    print(crypted_data.hex())

问题:
0.通过上面源码,怎么用php实现(rsa模数指数加密)?
1.为什么rsa有生成动态的,也有静态的,算法有什么不同?
2.这个模数和指数我用在线工具 (http://tool.chacuo.net/cryptrsamodulus2pkey) 生成【-----BEGIN PUBLIC KEY-----】公钥后加密 (https://www.lddgo.net/encrypt/rsa) 也不是相同的结果。怎么用模数和指数生成这种类型的公钥后实现自己选择,每次相同的结果或者不同结果。
3.今天才了解到base(64?)编码的有区分数字和字符编码的,比如AQAB和010001的关系,php当中用base64_encode()可以字符编码,那么数字编码是用什么?
好复杂啊 哭了

  • 写回答

2条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-10-18 03:18
    关注

    【以下回答由 GPT 生成】

    问题 0:通过上述Python源码,我想知道如何用PHP实现RSA模数指数加密?

    以下是用PHP实现RSA模数指数加密的步骤:

    1. 首先,你需要确保你的PHP环境安装了openssl扩展,以便进行RSA加密操作。

    2. 创建一个PHP文件,命名为rsa_encrypt.php

    3. 在PHP文件中,使用openssl_get_publickey()函数加载公钥文件或字符串,获取公钥资源。

    // 加载公钥文件
    $publicKey = openssl_get_publickey(file_get_contents('public_key.pem'));
    
    1. 将明文转换为字节并存储在一个变量中。
    $plaintext = "123"; // 值
    $input_nr = hex2bin($plaintext);
    
    1. 使用openssl_public_encrypt()函数对输入数据进行加密。
    $encrypted = "";
    openssl_public_encrypt($input_nr, $encrypted, $publicKey, OPENSSL_PKCS1_PADDING);
    
    1. 将加密后的数据转换为十六进制字符串。
    $crypted_data = bin2hex($encrypted);
    
    1. 打印加密后的结果。
    echo $crypted_data;
    

    完整的PHP代码示例:

    <?php
    // 加载公钥文件
    $publicKey = openssl_get_publickey(file_get_contents('public_key.pem'));
    
    $plaintext = "123"; // 值
    $input_nr = hex2bin($plaintext);
    
    $encrypted = "";
    openssl_public_encrypt($input_nr, $encrypted, $publicKey, OPENSSL_PKCS1_PADDING);
    
    $crypted_data = bin2hex($encrypted);
    
    echo $crypted_data;
    

    注意:此代码示例假设你已经有了一个public_key.pem文件,其中包含了正确格式的公钥。你可以使用openssl_pkey_get_public()函数将模数和指数传递给PHP的openssl_pkey_new()函数来生成相应的公钥。

    问题 1:RSA有生成动态和静态两种算法,具体有什么区别?

    RSA是一种非对称加密算法,用于数据的加密和解密。

    在生成RSA密钥对时,有两种方法:动态生成和静态生成。

    1. 动态生成:动态生成的RSA密钥对每次生成都是不同的。这意味着每次使用动态生成的密钥对加密相同的明文时,得到的密文也会不同。通常,动态生成的密钥对更加安全,因为每次加密都使用了不同的密钥对。

    2. 静态生成:静态生成的RSA密钥对在生成后是固定的。这意味着每次使用静态生成的密钥对加密相同的明文时,得到的密文也会相同。静态生成的密钥对适用于需要多次加密解密过程的应用场景,例如对称密钥的加密和解密。

    选择使用动态生成还是静态生成的RSA密钥对,取决于具体的使用场景和安全要求。

    问题 2:我使用在线工具(链接:http://tool.chacuo.net/cryptrsamodulus2pkey)生成了【-----BEGIN PUBLIC KEY-----】公钥并进行加密,但结果与Python代码不同。请问如何使用给定的模数和指数生成相同类型的公钥,然后选择每次加密结果是否相同?

    根据你提供的链接,该在线工具可以使用模数和指数生成RSA公钥。但是,与Python代码不同,可能是由于以下原因:

    1. 格式:Python代码中使用的是十六进制字符串,而该在线工具可能使用的是十进制或其他格式。

    解决方法:

    • 将十六进制字符串转换成相应的十进制数值。

    • 字节顺序:Python代码中使用的是大端字节顺序(big endian),该在线工具可能使用的是小端字节顺序(little endian)。

    解决方法:

    • 可以尝试将输入的十六进制字符串反转。

    • 填充方式:Python代码中使用的是无填充加密逻辑,该在线工具可能使用的是其他填充方式。

    解决方法:

    • 在加密之前,可以尝试在明文之前添加填充。

    • 编码方式:Python代码中使用的是字节编码,该在线工具可能使用的是其他编码方式。

    解决方法:

    • 尝试将输入的字符串转换为相应的字节编码。

    总之,为了在PHP中生成相同类型的公钥并选择每次加密结果是否相同,你可以尝试进行以上提到的转换和调整。

    问题 3:我最近了解到Base64编码可以区分数字和字符编码,比如"AQAB"和"010001"的关系。我知道在PHP中可以使用base64_encode()进行字符编码,但我不清楚数字编码应该使用什么方法。

    在PHP中,将一个整数编码为相应的Base64字符串,你可以使用以下步骤:

    1. 将整数转换为字节表示。
    $number = 65537; // 010001
    $bytes = pack("H*", $number);
    
    1. 使用base64_encode()函数对字节数据进行Base64编码。
    $base64 = base64_encode($bytes);
    
    1. 打印编码后的结果。
    echo $base64;
    

    完整的PHP代码示例:

    <?php
    $number = 65537; // 010001
    $bytes = pack("H*", $number);
    $base64 = base64_encode($bytes);
    echo $base64;
    

    这样,你就可以将一个整数编码为相应的Base64字符串。

    注意:Base64编码只是一种编码方式,并不能对数字进行真正加密。在RSA算法中,AQAB010001都是相同的表示方式,它们是RSA公钥的指数部分。

    希望这些解答能帮助到你。如果你还有其他问题或需要进一步的解释,请随时提问。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 11月20日
  • 已采纳回答 11月12日
  • 创建了问题 10月16日

悬赏问题

  • ¥15 EtherCAT的问题,创建一个XML文件
  • ¥15 微信公众号羽毛球自动抢定场程序制作
  • ¥15 Fluent UDF 编写
  • ¥15 xcode开发的macos应用,如何使窗口居中显示?
  • ¥20 统信uos升级apt后启动失败
  • ¥15 求指导储层饱和度及含水率测井解释
  • ¥200 建三维地震工区写入sgy到指定目录
  • ¥30 靶向捕获测序探针设计自学
  • ¥15 写代码写代码单片机代码写代码写数字按键代码
  • ¥15 django按照距离进行排序