我需要使用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);
};
我已经测试了许多衬垫,但我不能让它工作。知道为什么它不工作或者我必须改变什么才能让它工作吗?
你应该在你的用户名前面加上前缀
我对我当前尝试访问的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?我不需要任何填充或操作模式或密钥散列。 提前谢谢你。