首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >AES 256,带PKCS7/PKCS5填充GST电子发票

AES 256,带PKCS7/PKCS5填充GST电子发票
EN

Stack Overflow用户
提问于 2021-01-12 11:42:16
回答 1查看 170关注 0票数 1

我必须使用APP密钥解密加密的SEK,并使用解密的SEK编码JSON数据以发布电子发票生成和Java和C#的示例代码,我已经在PHP中进行了转换,但不幸的是在PHP中无法获得所需的输出,因为我从上周开始尝试OpenSSL不受支持

用于加密和解密的示例JAVA和C#代码

https://einv-apisandbox.nic.in/sample-code-in-java.html https://einv-apisandbox.nic.in/sample-code-in-c-sharp-dot-net.html

目标是在PHP语言中使用OpenSSL对数据进行解密和加密

到目前为止我的实现-

代码语言:javascript
复制
public function encrypt1($data, $secret_key)
  {
    return base64_encode(openssl_encrypt(base64_decode($data), $method='AES-256-ECB', base64_decode($secret_key), OPENSSL_RAW_DATA));
  }


  public function decrypt1($data,$secret_key)
  {
    return base64_encode(openssl_decrypt(base64_decode($data), $method='AES-256-ECB', $secret_key, OPENSSL_RAW_DATA));
  }
EN

回答 1

Stack Overflow用户

发布于 2021-01-12 15:26:44

在PHP中可以使用AppKey解密会话密钥,如下所示:

代码语言:javascript
复制
function decryptBySymmetricKey($encSekB64, $appKey) {
    $sek = openssl_decrypt($encSekB64, "aes-256-ecb", $appKey, 0);                  // the SEK
    $sekB64 = base64_encode($sek);                                                  // the Base64 encoded SEK
    return $sekB64;
}

在PHP中可以使用SEK对数据进行加密,如下所示:

代码语言:javascript
复制
function encryptBySymmetricKey($dataB64, $sekB64){
    $data = base64_decode($dataB64);                                                // the data to encrypt
    $sek = base64_decode($sekB64);                                                  // the SEK
    $encDataB64 = openssl_encrypt($data, "aes-256-ecb", $sek, 0);                   // the Base64 encoded ciphertext
    return $encDataB64;
}

这两个函数都可以使用以下数据进行测试:

代码语言:javascript
复制
$appKey = 'fao1PoKaLgd11xMrWTiL2cggAfx9QMwM';                                       // the 32 bytes AppKey
$encSekB64 = 'oRvKfBtmgNTSuk/oXUhiLOjXi45jiWA2oKNxhhQM3UH2o/32YWGLbUjK1/dohPe3';    // the Base64 encoded encrypted SEK 
$dataB64 = 'VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==';          // the base64 encoded data
$sekB64 = decryptBySymmetricKey($encSekB64, $appKey);                               // the Base64 encoded SEK   
$encDataB64 = encryptBySymmetricKey($dataB64, $sekB64);                             // the Base64 encoded ciphertext
echo $sekB64 . "\n";                                                                // zVoede7m2nnvMHcWYIfKhrvsilSFEZYiltJmxVQQnAQ=
echo $encDataB64;                                                                   // JS+hxYf64FMHThrhoIejqk3VjGwFw+GTYzUyVKc6GEOLKERVuvaNY91zPdo829r0

与C#参考代码的比较:

链接的C#方法DecryptBySymmetricKeyEncryptBySymmetricKey返回

代码语言:javascript
复制
byte[] appKey = Encoding.UTF8.GetBytes("fao1PoKaLgd11xMrWTiL2cggAfx9QMwM");
string encSekB64 = "oRvKfBtmgNTSuk/oXUhiLOjXi45jiWA2oKNxhhQM3UH2o/32YWGLbUjK1/dohPe3";
string dataB64 = "VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw==";
string sekB64 = DecryptBySymmetricKey(encSekB64, appKey);
string encDataB64 = EncryptBySymmetricKey(dataB64, sekB64);
Console.WriteLine(sekB64);      // zVoede7m2nnvMHcWYIfKhrvsilSFEZYiltJmxVQQnAQ=
Console.WriteLine(encDataB64);  // JS+hxYf64FMHThrhoIejqk3VjGwFw+GTYzUyVKc6GEOLKERVuvaNY91zPdo829r0

相同的值。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65677731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档