_read_ 2024-06-17 00:22 采纳率: 100%
浏览 9
已结题

有什么办法能将str类型的密文(以b'开头)转化为bytes类型,且不转义其中的反斜杠


def issue3(sk, pkR, nonce):
    # 创建RSA私钥对象
    sk = RSA.import_key(sk)

    # 创建RSA公钥对象
    pkR = RSA.import_key(pkR)

    # 使用公钥加密nonce 客户端用自己的pkR进行nonce的加密,然后把加密值nonce1发送给服务端
    #服务端使用自己的私钥sk对加密后的nonce1进行签名,返回预签名signature -psig
    cipher = PKCS1_OAEP.new(pkR)
    encrypted_nonce = cipher.encrypt(nonce.encode())
    print("pkR加密后的nonce", encrypted_nonce)

    # 对加密后的nonce进行哈希处理
    hashed_nonce = hashlib.sha256(encrypted_nonce).digest()

    # 使用SHA256算法创建哈希对象
    h = SHA256.new(hashed_nonce)
    print("pkR加密后的nonce的摘要h", h)

    # 对哈希对象进行签名
    signer = pkcs1_15.new(sk)
    signature = signer.sign(h)
    print("signature", signature)

    return signature, encrypted_nonce

以上函数是服务端里进行的,它返回了一个bytes类型的签名signature和加密值encrypted_nonce,我在后面的代码中将这两个值传入了数据库,然后客户端从数据库中取出这两个值进行操作。但是从数据库中select出来的encrypted_nonce类型是str,长度是729太长了用不了,我用密钥解密密文的时候需要的是256字节的密文长度。但是通过调试发现bytes类型的密文和select出来的str类型的密文长的是一模一样的,但就是类型不一样,且长度也不一样。用encode方法试图将str类型的密文转化为bytes类型,但是它将里面的反斜杠给转义掉了,并且长度还是729。我想要的是它转化为bytes类型之后的值,和原来的一模一样,就是不要转义反斜杠。有什么办法吗?

issue3函数返回的encrypted_nonce值为:
b'g\xb9\xaf\x80\x00nK\xe91\x1d\xe0\xdb\xbc3\x85D\xec\xc8\x1e\xf1\xa8%\xc6\x8c\xb7\xcfI\x08\x96S\xf22\x95\xfavf\x16x\xc5b\t\x8da\x0f\x03t\xf7\xd8\x9bWh~{D\xdc:t\x05\xcf\x08\x14\xbc\x1aA!\xfe4\xce\x0e\xd5k\xa8b\xa7\x1d\xf4\x85\xdbx\xd1*|\x17\xf08Q\xf4\xf4L\xae\x1e\xdbM\x9f\xa5/\x18\xa5\x04\x04\xbcw\x12\xe2\xd4\xe6\x01\xac\x82y\xc2t\x99-Y\xfe;\x05\x83x\x92,\xc5k\xbd\xb5\x151\xdeF3".\xee\xae\x979\xf0\xa7\xcbX\xeao\x0f\n\x13\xd4\xaf\x1d\xe5\x80\xf5f\x83!qV"\xdav\xa3\x1b\xfd\t\xa3\x93\xe3!\xb8w\x1a>\xf6\x887\xd9F\xc4<\x9e\x0c\x0fI\xb0\rr\xc6j+\xb5YJ\xcfG,\xed\x1b\x14\x0cV}\x8f\x9b\xa1\x98a\xa7\xff\x9f\xb3\xb29\xeb\x1e\x9d\xba\x1fk\xec\x1f/\x18\xc6-\x06+\x0b\x7f\xb6\xd5\xd7aN\xca\xdc\xbdq\xaa\r{\xfd"\xe7Tq!_\x81\x95<\xd9=Ln'
用type函数得到类型为bytes,用len函数得到长度是256

img

从数据库中select出来的encrypted_nonce值为:
b'g\xb9\xaf\x80\x00nK\xe91\x1d\xe0\xdb\xbc3\x85D\xec\xc8\x1e\xf1\xa8%\xc6\x8c\xb7\xcfI\x08\x96S\xf22\x95\xfavf\x16x\xc5b\t\x8da\x0f\x03t\xf7\xd8\x9bWh~{D\xdc:t\x05\xcf\x08\x14\xbc\x1aA!\xfe4\xce\x0e\xd5k\xa8b\xa7\x1d\xf4\x85\xdbx\xd1*|\x17\xf08Q\xf4\xf4L\xae\x1e\xdbM\x9f\xa5/\x18\xa5\x04\x04\xbcw\x12\xe2\xd4\xe6\x01\xac\x82y\xc2t\x99-Y\xfe;\x05\x83x\x92,\xc5k\xbd\xb5\x151\xdeF3".\xee\xae\x979\xf0\xa7\xcbX\xeao\x0f\n\x13\xd4\xaf\x1d\xe5\x80\xf5f\x83!qV"\xdav\xa3\x1b\xfd\t\xa3\x93\xe3!\xb8w\x1a>\xf6\x887\xd9F\xc4<\x9e\x0c\x0fI\xb0\rr\xc6j+\xb5YJ\xcfG,\xed\x1b\x14\x0cV}\x8f\x9b\xa1\x98a\xa7\xff\x9f\xb3\xb29\xeb\x1e\x9d\xba\x1fk\xec\x1f/\x18\xc6-\x06+\x0b\x7f\xb6\xd5\xd7aN\xca\xdc\xbdq\xaa\r{\xfd"\xe7Tq!_\x81\x95<\xd9=Ln'
用type函数得到类型为str,用len函数得到长度是729

img


然后我试图用encode函数来讲str转化为bytes,这是转化结果

img


可以看到它讲反斜杠给转义了,并且用len函数打印其长度,还是729
怎么解决这个问题呢

  • 写回答

2条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-17 00:22
    关注

    引自免费微信小程序:皆我百晓生

    要解决这个问题,关键在于理解str类型在Python中如何表示bytes类型的数据,以及如何正确地将这种表示转换回原始的bytes类型,同时保持数据的完整性,不改变任何字符,包括反斜杠。

    当从数据库中读取原本是bytes类型的数据时,通常会看到类似b'...'这样的格式,这是因为Python在打印bytes类型时,会以一种可读的字符串形式展示,包括将不可打印的字节用\xHH的形式表示。然而,当你从数据库中获取到这个数据时,它已经被解释成一个包含b'前缀和转义序列的str类型。

    为了将这个str类型的密文转换回原始的bytes类型,而不转义其中的反斜杠,你需要使用Python的ast.literal_eval()函数,它可以安全地解析Python的字面量结构。这种方法适用于你的情况,因为它可以正确处理字符串中的反斜杠,将其视为字节的一部分,而不是转义字符。

    下面是如何使用ast.literal_eval()函数来完成这个转换的示例代码:

    import ast
    
    # 假设这是从数据库中读取的str类型密文
    encrypted_nonce_str = "b'g\\xb9\\xaf\\x80\\x00nK\\xe91\\x1d\\xe0\\xdb\\xbc3\\x85D\\xec\\xc8\\n\\x1e\\xf1\\xa8%\\xc6\\x8c\\xb7\\xcfI\\x08\\x96S\\xf22\\x95\\xfavf\\x16x\\xc5b\\t\\x8da\\x0f\\x03t\\xf7\\xd8\\x9bW\\nh~{D\\xdc:"
    
    # 使用ast.literal_eval()转换为bytes类型
    encrypted_nonce_bytes = ast.literal_eval(encrypted_nonce_str)
    
    # 打印转换后的结果
    print(type(encrypted_nonce_bytes))  # 应输出 <class 'bytes'>
    print(len(encrypted_nonce_bytes))   # 应输出 256 或实际的字节长度
    

    这段代码的关键点在于ast.literal_eval()函数,它能够安全地将字符串形式的字面量转换为其Python数据类型。在这个场景下,它将带有转义序列的str转换成了未转义的bytes类型。

    使用上述代码,你应该能够成功地将从数据库中获取的str类型的密文转换回正确的bytes类型,以便进一步处理或解密。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月25日
  • 已采纳回答 6月17日
  • 创建了问题 6月17日

悬赏问题

  • ¥100 复现论文:matlab仿真代码编写
  • ¥15 esp32驱动GC9A01循环播放视频
  • ¥15 惠普360g9的最新bios
  • ¥30 这个功能用什么软件发合适?
  • ¥60 微信小程序,取消订单,偶尔订单没有改变状态
  • ¥15 用pytorch实现PPO算法
  • ¥15 关于调制信号的星座图?
  • ¥30 前端传参时,后端接收不到参数
  • ¥15 这是有什么问题吗,我检查许可证了但是显示有呢
  • ¥15 机器学习预测遇到的目标函数问题