Golang项目实战--基于Golang实现对文件的加密以及解密
项目背景
通过混淆和构造随机的字节映射表来实现文件的加密,同时设计和实现相应的解密程序,以及文件散列值校验程序,用于验证文件加密和解密过程中的正确性。
实现思路
再文件的某些特定位置,放入一些随机的字节进行混淆
基于用户输入的6位随机数字密码,构造一个字节映射表,将原始字节随机的映射为新的byte类型值。
基于上述两点,用户在解密的过程中需要先排除混淆的无用字节,根据得到的6为随机密码,将加密后的字节还原为原始的字节
编写计算文件散列值的程序,通过对比加密和解密后的文件散列值,校验加密和解密的正确性
理论步骤
在原始文件的头部和尾部两端,各插入一段固定长度的随机字节,用于混淆。
使用一个用户设定的随机密码,将原始文件内容的所有字节对应的byte类型值映射为一个新的byte类型值,并且保证映射后的两者绝对不想等。具体来说,可以将原始文件的字节的低128位(0-127)随机的映射为高128位(128-255)中的某个值:将原始文件字节的高128随机的映射为低128位的某个值。
去掉加密引入的混淆字节,即将投文件的头部和尾部的混淆字节去掉,实际上就是取加密后的文件中的一段字节切片,这个切片仅包含有效的内容。
根据用户设定的6位随机密码,得到原始文件字节与加密文件字节的映射表,将有效文件内容中的所有字节根据映射表进行变换,还原为原始字节,从而得到原始文件内容。
基于SHA256散列算法比对文件内容。散列算法又称哈希函数,是一种从任意类型的数据中创建小的数字“指纹”的方法。散列算法将消息或者数据压缩成摘要,使得数据量变小,并固定数据的格式。其原理是将数据打乱,混合,重新创建一个叫做散列值的“指纹”。文件的散列值一般采用十六进制数来表示,即0-9和A-F构成的十六进制数。
注解:
散列算法的一个重要特征:当原始文件发生一个小的变化时,其对应的散列值会产生非常大的变化。因此,如果两个文件的散列值相同,可以认为这两个文件相同。当然,也存在文件散列值相同但文件不同的情况,所以散列值位数越大,发生“撞库”的概率越小。
代码实战
首先实现将产生的随机字节放在文件头部和尾部,用于进行文件内容的混淆功能,创建rand.go文件
package utils
import (
crand "crypto/rand"
"log"
"math/big"
)
//生成随机字节
func GenRand(maxInt int64) (b byte, err error) {
r, err := crand.Int(crand.Reader, big.NewInt(maxInt))
b = byte(r.Int64())
return
}
//生成随机字节切片,用于进行文件内容的混淆
func GenConfuseBytes(n uint) (cb []byte, err error) {
cb = make([]byte, n, n)
for i, _ := range cb {
b, errByte := GenRand(256)
if errByte != nil {
log.Println("utils/rand.go/GenConfuseBytes:generate random bytes error:", errByte)
err = errByte
return
}
cb[i] = b
}
return
}