使用密码和salt生成密钥,然后使用此密钥加密数据(php)

使用密码和salt生成密钥,然后使用此密钥加密数据(php),php,encryption,Php,Encryption,我正在尝试向API发送数据。他们希望在发送之前将其加密 文档说明: 使用AES算法生成私钥(使用PKCS 5 V2.0方案的SHA-1 HMac函数)-我不知道这意味着什么 使用此密钥加密数据(数据为json_字符串)(PADDING_PKCS1=11,密钥长度为2048bit) 使用RSA算法和公钥加密私钥(他们给了我们一个pem文件) 然后以json格式发送加密数据 他们还提供了一个dll文件,所以我反编译了它,它使用了一个叫做BouncyCastle的库 他们的功能基本上就是这样; thi

我正在尝试向API发送数据。他们希望在发送之前将其加密

文档说明:

  • 使用AES算法生成私钥(使用PKCS 5 V2.0方案的SHA-1 HMac函数)-我不知道这意味着什么

  • 使用此密钥加密数据(数据为json_字符串)(PADDING_PKCS1=11,密钥长度为2048bit)

  • 使用RSA算法和公钥加密私钥(他们给了我们一个pem文件)

  • 然后以json格式发送加密数据

  • 他们还提供了一个dll文件,所以我反编译了它,它使用了一个叫做BouncyCastle的库

    他们的功能基本上就是这样;

    this.aesService.GenerateKey(password_variable, salt_file_contents_as_bytes); (they gives that both)
    byte[] data1 = this.aesService.Encode(json_string);
    byte[] data2 = this.rsaService.Encode(this.aesService.GetAesKey(), reads_public_keys_data_as_byte);
    // and some http requests nothing special
    
    我尝试的是;

    this.aesService.GenerateKey(password_variable, salt_file_contents_as_bytes); (they gives that both)
    byte[] data1 = this.aesService.Encode(json_string);
    byte[] data2 = this.rsaService.Encode(this.aesService.GetAesKey(), reads_public_keys_data_as_byte);
    // and some http requests nothing special
    
    1-使用带有密码和salt的openssl_pbkdf2函数生成密钥

    $key = openssl_pbkdf2($password, $salt, 32, 20000, 'sha1');
    
    2-使用openssl\u encrypt功能使用此密钥加密数据

    $encryptedJson = openssl_encrypt($json_string, "AES256", $key);
    
    openssl_public_encrypt($key, $encryptedAes, $public_key, OPENSSL_PKCS1_PADDING);
    
    3-使用openssl\u public\u encrypt函数加密我使用其公钥生成的密钥

    $encryptedJson = openssl_encrypt($json_string, "AES256", $key);
    
    openssl_public_encrypt($key, $encryptedAes, $public_key, OPENSSL_PKCS1_PADDING);
    
    4-使用bin2hex函数将此结果转换为十六进制并发送给他们

    $jsonData = bin2hex($encryptedJson);
    $keyData = bin2hex($encryptedAes);
    
    但它返回错误(表示无效对象-我不知道这是什么意思)。我问过他们,但他们还没有回答

    我想问你的是:

    我做的对吗?我使用的功能对吗

    编辑:


    他们仍然没有回复。但我只是在openssl_encrypt函数返回的加密数据的开头添加了IV,并将其转换为十六进制。瞧!成功了。

    如果他们编码为十六进制,我会感到惊讶。你需要弄清楚编码,也许可以看看使用代理或类似WireShark的东西向服务发送了什么。我知道你的代码没有太大问题。另一方面,他们的描述很糟糕。我想你猜对了PBKDF2。但这是一个猜测,他们需要更新他们的描述。https不是为你做了所有这些吗?@MaartenBodewes好主意,谢谢你。文档非常糟糕,他们不接你的电话或回复你的邮件。遗憾的是,这是一个办公室政府服务。