背景
需要一种能够对[6]字节进行编码和解码的密码。
std函数aes。NewCipher不允许这样做,因为它对块大小的定义是16字节。
不能简单地将6个字节填充为16个字节。我需要打印[6]字节作为条形码,并使用条形码进行远程解码。
代码
这可以在围棋场中运行
// You can edit this code!
// Click here and start typing.
package main
import (
"bytes"
"crypto/aes"
"fmt"
)
func main() {
plain := []byte("4512wqdeqwbuobouihodqwbuo")[:6]
encrypt := make([]byte, 6)
plain2 := make([]byte, 6)
cipher, err := aes.NewCipher([]byte("4512wqdeqwbuobouihodqwbuo")[:16])
if err != nil {
fmt.Println(err)
return
}
cipher.Encrypt(encrypt, plain)
cipher.Decrypt(plain2, encrypt)
if bytes.Compare(plain, plain2) != 0 {
fmt.Println("can't be", plain, plain2, encrypt)
}
}
错误:crypto/aes:输入不是全块
问题
- 是否有第三方功能可以满足我的需求
- 或者std函数可以通过某种方式实现这一点
- 通过移位和xor来实现这个指定的函数是幼稚的,还有更多吗
- 对于new,我已经用bit shift实现了这个功能
需要一个可以编码和解码[6]字节的密码。
编码(以不同格式显示数据(和加密(提供机密性(之间有区别。密码用于加密。此外,我认为您出于保密原因想要加密数据。
是否有第三方功能可以满足我的需求?或者std函数可以通过某种方式实现这一点?
理论上,有些方法不需要填充。请查看不同的操作模式。存在不需要填充的模式(CTR、OFB、..(,有效地将块密码转换为流密码。
甚至还有专用的流密码,如Salsa或ChaCha。
所以,现在您可以将6字节的明文加密为6字节的密文。
当您需要发送与明文相同数量的加密数据时,会出现两个问题:
-
为了在重复使用同一密钥进行多次加密的同时保持数据机密,每个密码都需要一些初始状态(IV(,它可以是随机的,也可以是计数器。不得重复使用相同的Key和IV。因此,在正常情况下,此计数器或状态会随加密数据一起发送。使用一些静态矢量可以破坏加密(部分或全部(。这就是评论中的人不能给你简单答案的原因。如果不传输额外的数据,就没有正确的加密。
-
另一个问题是数据完整性。如果密文在传输中被修改(有意或无意(,接收方就无法检测数据是否被修改,而不发送额外的字节。我假设有6个字节就没有完整性控制,所以也许这不是你关心的问题。
通过移位和xor来实现这个指定的函数是幼稚的,还有更多吗?
是的,您可以使用静态IV向量对数据进行加密,但这并不像我们所理解的那样正确加密,因此知道多个消息或初始信息后,数据可能会被完全解密。
使用一些简单的东西,比如XOR、矩阵运算。。。还不如把钥匙本身露出来。