关于使用sm4国密加密数据传输后解密中文乱码问题

三方提供加密方法如下

   protected static byte[] innerSM4Encrypt(byte[] src, byte[] key) throws Exception{
        byte[] dest = null;
       ****

        return dest;
    }

    /**
     * SM4加密入口
     * @param src
     * @param key
     * @return
     * @throws Exception
     */
    public static String sm4Encrypt(String src, String key) throws Exception {
        byte []tempBytes = innerSM4Encrypt(src.getBytes(), key.getBytes());
        return Base64.encodeBase64String(tempBytes);
    }

 对方接收到信息之后,进行解密后,参数校验不通过,后来查看日志发现中文解密乱码了。

但是在测试环境和本地环境联调时数据均正常传输,到灰度环境就出现这个问题。

于是双方均拿报文下来在本地解析也还是乱码。后面对加密前的参数编码也对照过,发现没问题。最后去对照主机配置编码,发现三方那边的编码是utf-8,而我这边灰度环境的编码是GBK。后来回来一品发现了一个问题。

byte []tempBytes = innerSM4Encrypt(src.getBytes(), key.getBytes());

在将字符串转换成二进制编码的时候,不设置编码的话,会自动获取系统的编码传输。因此在转换编码时需要设置编码才能正常将字符信息正常解密。

byte []tempBytes = innerSM4Encrypt(src.getBytes("utf-8"), key.getBytes("utf-8"));

### 回答1: 国密CA的生成和签发涉及到应用数据国密加密、签名和解密国密CA是国密算法的证书颁发机构,负责颁发和管理数字证书,确保数据的安全性和可信度。 首先,生成国密CA需要遵循相关的标准和规范。证书颁发机构需要进行身份验证,确保其具备发放数字证书的资质和能力。生成国密CA时还需要选择合适的国密算法,如SM2、SM3和SM4等,以保证数据的加密和签名安全。 生成国密CA后,可以开始应用数据的国密加密、签名和解密。在使用国密算法进行加密时,首先需要生成一对密钥,包括一个公钥和一个私钥。公钥用于加密数据,私钥用于解密数据。通过使用SM2算法对数据进行加密,可以保证数据的机密性和安全性。 对数据进行签名时,需要使用私钥对数据进行加密,并生成数字签名。通过使用SM2算法进行签名,可以确保签名的准确性和不可篡改性。签名后的数据可以与数字证书一起传播,用于证明数据的完整性和来源可靠性。 当接收方收到加密或签名数据后,使用相应的公钥进行解密或验证。使用SM2算法进行解密和验证,可以保证数据的解密正确性和签名的有效性。只有持有正确的私钥才能解密数据,只有正确的公钥能够验证签名。 总之,国密CA的生成和签发涉及到应用数据的加密、签名和解密。通过使用国密算法,可以保证数据的机密性、完整性和可信度。这些安全机制的应用使得数据传输和存储更加安全可靠。 ### 回答2: 国密CA(中国密码局认证中心)是由中国密码局授权的可信机构,负责国密算法下的数字证书的生成和签发。国密算法是中国自主研发的一种密码算法,用于保护数据的加密、签名和解密国密CA首先会生成一个根证书,该证书包含了国密算法所需的公钥和私钥等信息。根证书的私钥需要妥善保管,以确保证书的安全性。 在使用国密CA生成证书时,首先需要生成证书请求CSR(Certificate Signing Request)。CSR包含了证书的一些基本信息,比如需签发的证书的名称、密钥等。CSR由应用程序生成后,发送给国密CA。 国密CA收到CSR后,会对其进行验证,并使用根证书的私钥进行签名。签名后的证书会包含申请者的公钥以及其他相关信息,比如证书的有效期等。国密CA对签发的证书进行数字签名,以保证证书的真实性和完整性。 当应用程序需要进行数据的国密加密、签名或解密时,首先需要将数据进行相应的处理,然后使用证书中包含的公钥进行加密或签名操作。对于解密操作,则需要使用证书中对应的私钥进行解密国密CA的生成和签发过程保证了数字证书的可信和安全。应用程序可以通过使用国密算法下的证书实现数据的加密、签名和解密,确保数据的安全性和完整性。国密算法在国内得到了广泛的应用和认可,对于保护数据的安全非常重要。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值