Java和Objective-C中字符编码及DES加密解密

本文介绍了在Java和Objective-C中实现字符编码、字节加密解密的过程,特别是如何使用DES算法确保字符安全传输。讨论了字符编码如UTF-8与GBK之间的差异,以及在不同字符集下的转换问题。同时,详细阐述了Java和Objective-C中DES加密解密的步骤,包括使用BASE64编码和解码。文中强调了在实现跨平台加密解密一致性时需要注意的关键点,如字符编码、加密算法和字节流的一致性。
摘要由CSDN通过智能技术生成

1.概述

在基于互联网的应用中,发送端将字符采用某种方式加密后传输;而接受端根据事先约定的密钥进行解密,这样即使传输的字符被截获,也不会轻易被识别。而且,现在很多应用环境都很复杂,服务端是JAVA应用,客户端有JAVA应用、智能手机应用。我们以服务端为JAVA应用,客户端为智能手机IOS应用为例,实现在服务端加密一段字符,传输到客户端解密;在客户端又加密一段字符,传输到服务端解密,这样一个较为复杂的过程。

对于这种需求,有很多实现方式,如采用https加安全数字证书来实现,它在金融行业用得比较多。

这里采用DES算法完成这种字符安全传输的需求。首先声明一下,DES算法我也了解不多,下面的论述肯定有遗漏、错误等等不足之处,请参考性阅读,发现错误等请告诉我。在此先行谢过。

2.字符编码

所有计算机的字符都是按照某种字符集进行编码的,在网络中真正传输的是字节。

在客户端发送某串字符如”miki西游:mikixiyou@126.com”,它会按照客户端的字符集进行编码,形成字节流,在传输到某个服务端前,还需要使用BASE64进行编码,然后传到服务端。

服务端接收到之后,使用BASE64进行解码,然后按照它的默认字符集进行解码,形成字符串。如果客户端和服务端使用的默认字符集是一致的,如都是GBK,那么就会正确显示这段字符文字。如果不正确,如客户端用GBK编码,而服务器端用UTF8编码,那么就会出现乱码。我们经常在浏览器上见到乱码啊问号号等字符,就是这样字符集不一致所导致的。

以Java代码为例,解释一下字符如何编码,如何转换的操作过程。

   public static void main(String args[]) throws Exception {

 

Stringsource = "miki西游|mikixiyou@126.com";

      

       StringcharsetName=System.getProperty("file.encoding");

       System.out.println("file.encodingis "+charsetName);

       System.out.println("source="+source);

       System.out.println(parseByte2HexStr(source.getBytes("GBK")));

       System.out.println(parseByte2HexStr(source.getBytes()));

              

       System.out.println(parseByte2HexStr(source.getBytes("UTF-8")));

       String source_utf8=newString (source.getBytes("UTF-8"),"UTF-8");

       System.out.println("source_utf8="+source_utf8);

       String source_gbk=newString (source.getBytes("GBK"),"GBK");       

       System.out.println("source_gbk="+source_gbk);

   }

在这段代码中,我们使用这个方法source.getBytes()的source字符串默认字符集的编码。

String source = " miki西游| mikixiyou@126.com;

System.out.println(parseByte2HexStr(source.getBytes()));

输出结果为

6D696B69 CEF7 D3CE 7C206D696B697869796F75403132362E636F6D

前两个字节CEF7表示“西”,后两个字节D3CE表示“游”。GBK字符集对于汉字采用两字节编码的。

字符串source的默认字符集可以通过系统属性得到,它是每一个JAVA的文件编码。获取的方法如下:

       StringcharsetName=System.getProperty("file.encoding");

       System.out.println("file.encodingis "+charsetName);

输出结果为

file.encoding is GBK

 

如果按照UTF-8字符集获取编码,那么输出的字节流将按照UTF-8编码方式进行输出。

       System.out.println(parseByte2HexStr(source.getBytes("UTF-8")));

       String source_utf8=newString (source.getBytes("UTF-8"),"UTF-8");

输出结果为

6D696B69 E8A5BF E6B8B8 7C206D696B697869796F75403132362E636F6D

三个字节E8A5BF表示“西”,三个字节E6B8B8表示“游”。UTF-8字符集对于汉字采用三字节编码的,对于英文字符及数字还是单字节编码。

在互联网中,传输的字节流还需要进行BASE64编码。我不知道是不是因为字节流太长了什么的,需要BASE

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值