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

AES-256-CBC PKCS7 从 PHP 填充以连接到 .NET 服务器

滕成双
2023-03-14

我需要使用AES-256-CBC和PKCS7填充加密用户和密码,以连接到它不是我的.NET服务器应用程序。

首先,我使用Diffie-Hellman算法获得了公共服务器密钥,遵循本网站上的说明:

https://doc.developer.milestonesys.com/mipsdkmobile/index.html?base=content_0.html

从服务器获取公钥的代码是:

private const DH_PRIME = 'F488FD584E49DBCD20B49DE49107366B336C380D451D0F7C88B31C7C5B2D8EF6F3C923C043F0A55B188D8EBB558CB85D38D334FD7C175743A31D186CDE33212CB52AFF3CE1B1294018118D7C84A70A72D686C40319C807297ACA950CD9969FABD00A509B0246D3083D66A45D419F9C7CBD894B221926BAABA25EC355E92F78C7';
private const DH_GENERATOR = '02';

$privateKey = gmp_init(uniqid(), 32);
$publicKey = gmp_powm(self::DH_GENERATOR, $privateKey, base_convert( self::DH_PRIME, 16,10));

一旦我拿到密钥,所以它在这里工作得很好,我必须使用我的私钥计算服务器密钥,之前解码base64服务器密钥,并将其从二进制转换为十六进制:

// Decode server public returned key (encoded in base 64)
$serverPKBase64Decoded = base64_decode($apiResponse['response']['Command']['OutputParams']['Param']['7']['@attributes']['Value']);
$serverPublicKey16 = bin2hex($serverPKBase64Decoded);

// Calculate shared key
$prime = gmp_init(self::DH_PRIME,16);
$serverPk = gmp_init($serverPublicKey, 16);
$localPk = gmp_init($localPrivateKey,32);
$sharedKey = gmp_powm($serverPk, $localPk, $prime);

// Get shared key as hexadecimal value
$sharedKeyHex = gmp_strval($sharedKey, 16);

现在,到了获取初始化向量(iv)和加密用户名和密码的密钥的部分:

$iv = substr($sharedKeyHex,0,16);
$key = strlen($sharedKeyHex)-32,32);
// Encrypt username and password
$encryptedUsername = base64_encode(openssl_encrypt($username,$cipher,$key,OPENSSL_RAW_DATA,$iv));
$encryptedPassword = base64_encode(openssl_encrypt($password,$cipher,$key,OPENSSL_RAW_DATA,$iv));

当我发送数据并得到响应时,它会抛出一个错误16,文本为“不正确的公钥”。

我们提供商的SDK提供了登录过程等效的示例(在使用CryptoJS的JS上)。请确认JS中的代码是否与PHP中的代码相同:

JS代码:

/**
     * Encode a string using client and server public keys
     * 
     * @param       str         string      String to encode
     * @access                  public
     * @return                  string      Base64 encoded encrypted string
     */
    this.encodeString = function(str) {
        var secretString = this._sharedKey || this.getSharedKey().substring(0, 96);

        var key = CryptoJS.enc.Hex.parse(secretString.substring(32, 96)); 
        var iv = CryptoJS.enc.Hex.parse( secretString.substring(0,32) ); 
        
        var params = { 'iv': iv };
        if (XPMobileSDKSettings.defaultEncryptionPadding && CryptoJS.pad[XPMobileSDKSettings.defaultEncryptionPadding]) {
            params.padding = CryptoJS.pad[XPMobileSDKSettings.defaultEncryptionPadding];
        }
        return CryptoJS.AES.encrypt(str, key, params).ciphertext.toString(CryptoJS.enc.Base64);
    };

我已经测试了许多衬垫,但我不能让它工作。知道为什么它不工作或者我必须改变什么才能让它工作吗?

共有1个答案

壤驷经国
2023-03-14

你应该在你的用户名前面加上前缀

 类似资料:
  • 我对我当前尝试访问的API的加密有以下要求: < li>PKCS7填充方法 < li>CBC加密模式 < li>AES密钥大小256,块大小128 每次我提交带有加密的API时,API似乎都有问题(不幸的是没有产生错误)。 问题: PKCS7填充方法到底是什么,可以用php实现? AES 256很好,但是块大小到底是什么意思? IV到底是做什么的?

  • 如果公司营业额大于50亿卢比,GST理事会已批准将企业对企业(B2B)发票的“电子发票”或“电子发票”实施到GST系统。参考商品及服务税门户 API :einv-apisandbox.nic.in/index.html 我必须使用APP密钥对加密的SEK进行解密,并使用解密的SEK对json数据进行编码,以便发布Einvoice Generation,我找到了java和C#的示例代码,我已经用PH

  • 我正在重写代码以与PHP 7.2兼容 根据我的研究,新代码应该是这样的 但我尝试了openssl_encrypt选项的每一种组合:、、

  • 我目前使用< code > AES/CBC/PKCS 5 Padding 对Java文件进行加密,密钥大小为256字节,但在搜索时,我在stack exchange PKCS # 5-PKCS # 7 Padding上发现了它, PKCS#5填充是8字节块大小的PKCS#7填充的子集 所以我想知道 > < li >对于上述配置,< code > AES/CBC/pkcs 7 padding 的性能

  • 我无法使用某些连接字符串从C#.NET代码连接到远程PostgreSQL服务器。(我的连接字符串包含基本信息,如主机地址,端口,用户名,密码,数据库名)。 我的连接字符串: 注意:我使用的是.NET程序集 我得到的错误是:

  • 关于AES有很多问题,但我有以下问题。我目前正在使用以下 AES 实现来加密数据 结果是32字节(256位)。所以我使用的是AES-256。这个实现对我来说太慢了。我如何切换到AES-128?我不需要任何填充或操作模式或密钥散列。 提前谢谢你。