解决SM4加密解密过程XML文件中出现的乱码问题

解决SM4加密解密过程XML文件中出现的乱码问题

  • 问题表述:XML文件中出现乱码
    • 乱码问题出现原因分析
    • 解决思路
    • 总结

问题表述:XML文件中出现乱码

数据信息通过XML文件在不同网络中传递时,为了保证数据安全往往需要通过SM4、BASE64等算法对传输的内容进行加密,接收方在接收到加密XML文件后再进行解密。但是最近在使用中出现了一个问题:通过SM4算法解密的XML文件,偶尔会在文件末尾出现乱码。
具体情况如图所示:
解决SM4加密解密过程XML文件中出现的乱码问题_第1张图片

乱码问题出现原因分析

为了分析乱码问题出现的原因,需要了解SM4算法加解密的原理:
以下内容来自百度百科:
SM4.0(原名SM4.0)是中华人民共和国政府采用的一种分组密码标准,由国家密码管理局于2012年3月21日发布。
相关标准为“GM/T 0002-2012《SM4分组密码算法》(原SM4分组密码算法)。
SM4是一种对称密码算法,与DES和AES类似,属于分组加密。SM4算法明文和密钥的长度都为128bit,这与AES类似。SM4加解密的原理与DES类似,采用feistel网络结构,加解密和密钥扩展都是32轮迭代结构,解密与加密原理类似,使用的密钥也相同,不同的是,解密密钥使用的次序与加密时相反。
解决SM4加密解密过程XML文件中出现的乱码问题_第2张图片
详细内容请看链接:SM4加解密详解以及Java实现: https://www.cnblogs.com/kentle/p/14135865.html

乱码原因猜测(个人理解,欢迎讨论):SM4作为一种分组加密,每个分组的长度一般为128bit,在加解密时采用32轮迭代结构,将分组按位拆分成 4 个 32bit 的数据,这导致可能出现拆分时末尾数据无法形成完整的单个分组数据,在解密不完整片段时可能出错,出现乱码。乱码出现后读取该XML文件时就会报错。

解决思路

查了很多的内容,但是没有什么特别有用的建议,这也是写这篇文章的原因。
我采用的解决方法是: XML文件在SM4算法解密后不直接解析,而是对解密后文件进行一次筛选,将有用的数据写入到新的XML中,最后解析经过数据筛选过的新写入的XML文件。
过程表示:
1.SM4解密XML文件
2.对解密后的XML文件进行数据过滤,筛去乱码的内容,将正确的XML节点信息写入新的XML文件中
3.解析新写入的XML文件
4.总结:简单来说,接收到的XML为A文件,解密后为B文件,将B文件中有用的XML节点信息写入到C文件中,解析读取C文件

解密
数据过滤
接收到的XML为A文件
B文件:过渡文件
最终结果C文件

Java代码:

String tempStatusPath="E:\\temp\\receive.xml"; //读入解密过的XML
File temp=new File(tempStatusPath);
BufferedReader reader=new BufferedReader(new FileReader(temp));
String tempStr=null;
ArrayList<String> resultStr=new ArrayList();
while(((tempStr=reader.readLine())!=null)){
//只有有效XML节点才有必要写入到新的XML文件中
    if(tempStr.indexOf("<")>=0){ 
        resultStr.add(tempStr);
    }
}
reader.close();
try {
    BufferedWriter output=new BufferedWriter(new FileWriter("E:\\temp\\result.xml"));
    for(String str:resultStr){
        output.write(str+"\n");//将筛选过的数据写入到新的XML文件
    }
    output.close();
}catch (IOException e){

}

改动了两个月了,都没有再出现过解析失败的问题,运行情况良好

总结

我一开始的思路是删除掉XML中乱码那一行,但是实际操作下来,要不然误删了有正确数据的那一行,要不然就删不掉乱码的那一行,总之效果不好。后来我采用筛选出有用的信息再写入到新的XML文件中的方法啊,效果就好了很多。
希望对大家有用!

你可能感兴趣的:(java,开发语言,xml)