当前位置: 首页 > 知识库问答 >
问题:

为什么这三个算法最后输出的值不一样,一个node.js写的,一个python和go写的?

马煌
2023-05-21

python代码:代码地址:

import logging
import io
from hashlib import sha1
from struct import pack, unpack

from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes

logger = logging.getLogger(__name__)
logger.addHandler(logging.NullHandler())
    @staticmethod
def decrypt(key, ibuf):
    r"""
    Return decrypted data.

    """
    obuf = io.BytesIO()
    totalSize = unpack("<I", ibuf.read(4))[0]
    logger.debug("totalSize: {}".format(totalSize))
    ibuf.seek(8)
    aes = Cipher(algorithms.AES(key), modes.ECB(), backend=default_backend())
    decryptor = aes.decryptor()
    x = ibuf.read()
    dec = decryptor.update(x) + decryptor.finalize()
    obuf.write(dec[:totalSize])
    return obuf.getvalue()  # return obuf.getbuffer()

node.js代码:

function decrypt (key, ibuf) {
  console.log(`totalSize: ${key.byteLength}`);
  const obuf = Buffer.alloc(0);
  const totalSize = ibuf.readUInt32LE(0);
  console.log(`totalSize: ${totalSize}`);
  // const aesKey = crypto.createDecipheriv('aes-128-ecb', key, Buffer.alloc(0), { authTagLength: 0 });
  const aesKey = crypto.createCipheriv('aes-128-ecb', key, Buffer.alloc(0), { authTagLength: 0 });
  const x = ibuf.slice(8);
  // const x = ibuf.slice(4, totalSize + 16 - (totalSize % 16));
  const dec = Buffer.concat([aesKey.update(x), aesKey.final()]);
  const resultBuf = dec.slice(0, totalSize);
  return resultBuf;
}

go 代码:代码地址:

// standardDecrypt decrypt the CFB file format with ECMA-376 standard encryption.
func standardDecrypt(encryptionInfoBuf, encryptedPackageBuf []byte, opts *Options) ([]byte, error) {
    encryptionHeaderSize := binary.LittleEndian.Uint32(encryptionInfoBuf[8:12])
    block := encryptionInfoBuf[12 : 12+encryptionHeaderSize]
    header := StandardEncryptionHeader{
        Flags:        binary.LittleEndian.Uint32(block[:4]),
        SizeExtra:    binary.LittleEndian.Uint32(block[4:8]),
        AlgID:        binary.LittleEndian.Uint32(block[8:12]),
        AlgIDHash:    binary.LittleEndian.Uint32(block[12:16]),
        KeySize:      binary.LittleEndian.Uint32(block[16:20]),
        ProviderType: binary.LittleEndian.Uint32(block[20:24]),
        Reserved1:    binary.LittleEndian.Uint32(block[24:28]),
        Reserved2:    binary.LittleEndian.Uint32(block[28:32]),
        CspName:      string(block[32:]),
    }
    block = encryptionInfoBuf[12+encryptionHeaderSize:]
    algIDMap := map[uint32]string{
        0x0000660E: "AES-128",
        0x0000660F: "AES-192",
        0x00006610: "AES-256",
    }
    algorithm := "AES"
    _, ok := algIDMap[header.AlgID]
    if !ok {
        algorithm = "RC4"
    }
    verifier := standardEncryptionVerifier(algorithm, block)
    secretKey, err := standardConvertPasswdToKey(header, verifier, opts)
    if err != nil {
        return nil, err
    }
    // decrypted data
    x := encryptedPackageBuf[8:]
    blob, err := aes.NewCipher(secretKey)
    if err != nil {
        return nil, err
    }
    decrypted := make([]byte, len(x))
    size := 16
    for bs, be := 0, size; bs < len(x); bs, be = bs+size, be+size {
        blob.Decrypt(decrypted[bs:be], x[bs:be])
    }
    return decrypted, err
}

请大佬指教为什么我参考python代码写的node.js代码最后输出的内容是不一样的,py版和go版的可以解密成功,node.js的代码可以运行,但是最后解密出来的是不对的?是因为aes-128-ecb算法需要分块解密吗?

共有1个答案

牛越
2023-05-21

解密?为什么是用的 createChipheriv 而不是 createDechipheriv

 类似资料:
  • py代码如下: 参考py写的node.js代码如下 node.js 的解密参数全是和py的一样,打印出来的key也是一样的,说明makeKey方法是一样的, 就是接下来的rc4解密,不知道是我node.js哪里写的不对,最后解密出来的verifierHash和 hash 不一样,求大神解答下,是不是node.js这里的rc4解密有问题导致的,还是哪里有问题?

  • python 代码:地址: node.js 代码: python 输入输出: node.js 输入输出: 请大佬指教为什么我参考 python 代码写的 node.js 代码最后输出的内容是不一样的?

  • 小白菜疑问,能不能详细地跟我说一下两种写法的区别? 题目:使用函数求素数和: 定义prime(p), 其中函数prime当用户传入参数p为素数时返回True,否则返回False 定义PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m<n 假设输入m=1,n=10 疑问:下面是两种不同的写法,第一个是我写的,第二个是正确答案TT,我不太

  • 问题内容: 我发布此消息是因为该主题刚刚在另一个问题/答案中提出,并且该行为没有得到很好的记录。 考虑数据框 我想获取由column定义的每个组的第一行和最后一行。 我试过了 但是,这并没有给我我所期望的。 如何获得每个组中的实际第一个和最后一个值? 问题答案: 一种选择是使用该方法: 但是,我还没有找到一种将它们整齐地聚合的方法。当然,总是可以使用构造函数: 注意:我明确使用了该属性,否则您必须

  • 下面的代码基于@a.bertucci提供的一个示例,这里使用Android上的RxJava以固定的间隔在UI中绘制对象,其中我使用计时器压缩了一个可观察对象。当我通过调用processDelayedItems()触发订阅时,压缩的Observable中的代码[A]只执行一次,一个项目被发送到[B]。我原本希望代码[A]在触发后继续运行,并保持每1500毫秒发出一次项,但显然它在这里只运行一次。 >

  • 比如给680,区间是676-680, 给681,区间是681-685, 给682,区间是681-685 给687,区间是686-680