国密算法签名与加密结果字节长度变化及Hex与Base64编码长度变化

Posted 帅气的梧桐述

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了国密算法签名与加密结果字节长度变化及Hex与Base64编码长度变化相关的知识,希望对你有一定的参考价值。

有很多应用场景,数据通常经过加密和编码后传输,有时我们需要知道经过处理后的数据的长度,此时就需要分析各种算法的数据处理策略,及结果变化。下边主要介绍国密SM2算法签名与加密结果字节长度变化及Hex与Base64编码长度变化。

前提:

1,ASCII码:一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。

2,UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。中文标点占三个字节,英文标点占一个字节。

3,Unicode编码:一个英文等于两个字节,一个中文(含繁体)等于两个字节。中文标点占两个字节,英文标点占两个字节。

数据存储是以“字节”(Byte)为单位,数据传输大多是以“位”(bit,又名“比特”)为单位,一个位就代表一个0或1(即二进制),每8个位(bit,简写为b)组成一个字节(Byte,简写为B),是最小一级的信息单位。

Hex16进制编码

1英文字符=1Byte=8bit 

1中文字符=3Byte=24bit

16进制采用0-F来表示,4bit可以表达16进制的值(0000~1111)。

故采用16进制编码1个字符后,会变成2个16进制符,相当于是增加了2倍的数据量。

Base64编码

Base64 编码是基于64个字符 A-Z,a-z,0-9,+,/ 的编码方式,因为2的6次方正好为64,所以就用6bit就可以表示出64个字符。
3Byte=24bit,正好可以表达Base64中4个字符。所以长度大概是字节数组的1.3333倍。

字符长度是3的倍数的,则编码后的长度计算公式为:

i/3*4

不是3的倍数的,则编码后的长度计算公式为:

i/3*4+4

其中i表示原字符个数,i/3取整。

国密算法SM2签名

正常签名结果为64字节,但是由于签名后会做ASN.1编码,实际输出长度为70-72字节不等。

国密算法SM2加密

支持近128G字节数据长度,加密结果增加97个字节。

国密算法SM2加密+Base64编码后的数据增长量

按照每次加密增加97个字符计算,则最小的加密后长度为97或98,再将97带入Base64编码后的长度计算公式i/3*4+4=132,再按照132/97≈1.36,则原数据的最大增长量为1.36倍,后边随着原文长度增加,对应的增长量会变低。

以上是关于国密算法签名与加密结果字节长度变化及Hex与Base64编码长度变化的主要内容,如果未能解决你的问题,请参考以下文章

国密算法

openssl 加解密以及国密算法

国密算法说明SM2SM3SM4

国密SM2的前端加密,后端解密(Java版本)及SM3 摘要加密

信息安全工程师笔记-国产密码算法(国密)概念

国密SM4算法加密解密实现以及与Spring Security集成实现