有一段中文我用 Encoding.UTF-8.GetBytes( 中文)转为byte数组,然后切割一段900字节左右的转为字符串。怎么才能不乱码?
备注:utf-8不像gb2312中文是固定2字节。
为什么要切割 900 字节?
900左右但不能超过1024 加密机加密不了
@路飞的小蝴蝶: 你的最终目的是想把超过 1024 字节的数据分段加密,还是只需要加密前 1024 字节数据就可以了?
@Launcher: 人家给我的接口是要传中文的。要是传字节就好办了。所以我得算好长度不能超过1024字节的字符串,还得算好切割时不乱码
@路飞的小蝴蝶: 传中文是什么意思?是在人家的加密实现中需要实时的显示或者写入中文字符吗?
@Launcher: 别人提供的调用加密机指令的类库。传入的是字符串,而且要求不超过1024 utf-8转字节码后的字节数。想不到好办法呀
@路飞的小蝴蝶: 你把别人的 api 的接口贴出来我看看。
@Launcher:
public string EncMsg(string Msg, string Key, out string EncMsg)
{
int iResult;
EncMsg = "";
StringBuilder sbEncMsg = new StringBuilder();
byte[] ret = new byte[3];
byte[] curMsg;
int processedLen = 0;
byte[] msg = Encoding.UTF8.GetBytes(Msg);
int HLen = msg.Length + 4;
byte[] msgBytes = new byte[HLen];
msgBytes.SetValues(msg.Length.ToString("D08").ToHex(), 0, 4);
msgBytes.SetValues(msg, 4, msg.Length);
while (processedLen < HLen)
{
int curLen = HLen - processedLen;
if (curLen > 900)
curLen = 900;
ret = new byte[3];
EncMsg = "";
curMsg = new byte[curLen];
Buffer.BlockCopy(msgBytes, processedLen, curMsg, 0, curLen);
iResult = _hsmRal.HsmIstE0_("0".ToASCII(), "1".ToASCII(), "I".ToASCII(), "0".ToASCII(), Key.ToASCII(), 32, curLen, curMsg, ref EncMsg, ref ret);
if (ret.ToASC(0, 2) == "00")
{
sbEncMsg.Append(EncMsg);
}
else
{
return ret.ToASC(0, 2);
}
processedLen += 900;
}
EncMsg = sbEncMsg.ToString();
return ret.ToASC(0, 2);
}
@路飞的小蝴蝶: 请问这个“public string EncMsg(string Msg, string Key, out string EncMsg)”是别人的,还是这个“_hsmRal.HsmIstE0_” 是别人的?
@Launcher: _hsmRal.HsmIstE0_("0".ToASCII(), "1".ToASCII(), "I".ToASCII(), "0".ToASCII(), Key.ToASCII(), 32, curLen, curMsg, ref EncMsg, ref ret);别人的,但是我送给他的时候必须要是不乱吗的字节码。就是转为utf-8的字节码时不能把中文汉字拆分过来
@路飞的小蝴蝶: 我注意到 HsmIstE0_ 方法中的两个参数:curLen, curMsg,对应的 C/C++ 定义为:
int len,const char * pMsg,其含义是对从 pMsg 开始的 len 个字节加密,这里指定了长度,因此与字符串编码无关。所以,你能讲清楚,为什么它必须要把 pMsg 表达成一个有效的字符串吗?
@Launcher: 因为人家解密的时候也要分包解密,调用底层密文进去出来的是16进制的字符串,在转为中文的时候我担心有问题。
@路飞的小蝴蝶: 我假设要加密的中文字符串是“路飞”,按照 UTF-8 转换成字节数组是 {0x20,0x33,0x40,0x56},现在我将此字节数组分成两部分加密,先将 {0x20} 加密(这明显不是一个完整的中文字)后得到的密文字节数组是:{0x22,0x45,0x66},然后将{0x33,0x40,0x56}加密后的到密文字节数组是:{0x11,0x47,0x68}。
现在我们来看解密操作:
将密文{0x22,0x45,0x66}解密后,是不是能得到明文{0x20}?
将密文{0x11,0x47,0x68}解密后,是不是能得到明文{0x33,0x40,0x56}?
然后我们把两次解密的结果组合起来{0x20} + {0x33,0x40,0x56},是不是就得到了最初的明文{0x20,0x33,0x40,0x56}?现在在将此字节数组按照 UTF-8 编码成字符串,是不是就能得到明文“路飞”?
那么请问,从上面的加解密流程中,你是如何看出加解算法跟编码有关联的?
@Launcher: 明白了,谢谢你!解密解不了是其他的原因。
先把你的“中文”切割成N个小段,再把这些小段用Encoding.UTF-8.GetBytes呀,得出来的不就可以加密了??????