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
}

 

posted @ 2023-05-10 16:42  99号的格调  阅读(723)  评论(0编辑  收藏  举报