由区块链引发的密码技术讨论(二)计算机基础

第二章 计算机基础

现代密码技术是建立在计算机的基础之上,计算机操作的对象并不是文字,而是有0和1排列而形成的比特序列,无论是文字、图像、视频,在计算机眼中,都是一堆的比特序列,在加密操作的过程中,就是将明文的0和1转换为密文的0和1,我们把现实世界中的东西映射为0和1的操作叫做编码。

2.1 编码

什么是编码及常见的编码,有兴趣可以参考我的另外一篇博文《一文搞懂ASCII编码、Unicode编码、UTF-8编码》

2.2 二进制、八进制、十进制、十六进制

我们现实中的人类语言采用的是十进制,如0,1,2,3,4,5,6,7,8,9,10,每到9之后就加多一位。

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

例如:11010101总共有8个位,计算机最常用的就是8个组成一个字节。那这个数的十进制是多少呢?可以使用下面的计算方法:

二进制转十进制:

八进制,0,1,2,3,4,5,6,7八个数字,逢八进1。

十六进制,0 1 2 3 4 5 6 7 8 9 A B C D E F 当数位上的值超过15就要进1。

八进制比较少用,我们用下面的表格对比二进制、十进制、十六进制之间的关系。

二进制转十六进制:

对于上面的11010101二进制数,从右向左将二进制数分为若干组,每一组都是一个四位二进制数,最左端的一组不足四位时在左端补0,计算出每组二进制数所对应的十进制数,从左向右依次排列这些十进制数便得到转换后的十六进制数。

那么:1101=13=D 0101=5=5,所以二进制11010101的十六进制为D5。

十六进制转十进制:

我们验证一下:十六进制转十进制的方法为十六进制数从右向左的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……然后相加得出十进制数。

第0位:

第1位:

十进制转二进制:

十进制转二进制方法,除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。如下图:

python中提供了内置函数供我们进行进制的转换

# 获取用户输入十进制数
num = int(input("输入数字:"))
print("十进制数为:", num)
print("转换为二进制为:", bin(num))
print("转换为十六进制为:", hex(num))
# 反向转换
a1 = '11010101'
a2 = '0xd5'
print("二进制转十进制:",int(a1,base=2))
print("十六进制转十进制:",int(a2,base=16))
-----------------------------------
输入数字:213
十进制数为: 213
转换为二进制为: 0b11010101
转换为十六进制为: 0xd5
二进制转十进制: 213
十六进制转十进制: 213

2.3 Base64编码

为了更简洁方便地表示长串的数字,使用更少的符号,许多计算机系统会使用一种以数字和字母组成的大于十进制的表示法。 例如,传统的十进制计数系统使用0-9 十个数字, 而十六进制系统使用了额外的 A-F 六个字母。Base64 使用了26 个小写字母、26 个大写字母、10 个数字以及两个符号“+”和“/” ,传输二进制数据,简单说Base64编码是从字节序列转换到字符的过程。

Base64要求把每三个8Bit的字节转换为四个6Bit的字节(3*8 = 4*6 = 24),然后把6Bit再添两位高位0,组成四个8Bit的字节,也就是说,转换后的字符串理论上将要比原来的长1/3。

例如:

转换前 11111111, 11111111, 11111111 (二进制)

转换后 00111111, 00111111, 00111111, 00111111 (二进制)

如果要编码的二进制数据不是3的倍数,Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

下面使用python,举例说明Base64的应用:

# -*- coding: utf-8 -*-
import base64
text = '我爱中国'.encode()
#默认以utf8编码,把字符串转换为bytes对象,bytes表示字节序列,是一个不可变的数据类型
res = base64.b64encode(text)
print('Base64编码:',res.decode())
res = base64.b64decode(res)
print('Base64解码:',res.decode())

输出:
Base64编码: 5oiR54ix5Lit5Zu9
Base64解码: 我爱中国

我们回顾第一章中,小强发给小红的“k0oj5cPNQQAoqkqKHC4d94kBEyczzYd8+IPpNfVDnDa3un1weqcz17mYsvOeIQ6aMxA5+ulF3xviiaJrEtfW6w==”这一句加密内容,其实也就是使用了Base64编码。我们尝试者还原它:

# -*- coding: utf-8 -*-
import base64
a = b'k0oj5cPNQQAoqkqKHC4d94kBEyczzYd8+IPpNfVDnDa3un1weqcz17mYsvOeIQ6aMxA5+ulF3xviiaJrEtfW6w=='
b = base64.b64decode(a)
print(b)

输出:
b"\x93J#\xe5\xc3\xcdA\x00(\xaaJ\x8a\x1c.\x1d\xf7\x89\x01\x13'3\xcd\x87|\xf8\x83\xe95\xf5C\x9c6\xb7\xba}pz\xa73\xd7\xb9\x98\xb2\xf3\x9e!\x0e\x9a3\x109\xfa\xe9E\xdf\x1b\xe2\x89\xa2k\x12\xd7\xd6\xeb"

可以看到输出的是一个bytes类型的字节序列,因为是加密运算后的字节序列,所以也看不出内容是什么东西。

以下是Base64的对应表

2.4 Base58编码

Base58和Base64类似,是一种基于文本的二进制编码格式,这种编码格式不仅实现了数据压缩,保持了易读性,还具有错误诊断功能。Base58是Base64编码格式的子集,同样使用大小写字母和 10 个数字, 但舍弃了一些容易错读和在特定字体中容易混淆的字符。 比如:Base58少了8个(0 , O (大写O),I(大写i) ,l(小写L) ,+(加号) ,/ (后倒线)),现在被用于区块链领域。

发布了29 篇原创文章 · 获赞 4 · 访问量 7571

猜你喜欢

转载自blog.csdn.net/cd4836/article/details/103196726
今日推荐