需要aes密码函数允许输入[6]字节



背景

需要一种能够对[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:输入不是全块

问题

  1. 是否有第三方功能可以满足我的需求
  2. 或者std函数可以通过某种方式实现这一点
  3. 通过移位和xor来实现这个指定的函数是幼稚的,还有更多吗
  4. 对于new,我已经用bit shift实现了这个功能

需要一个可以编码和解码[6]字节的密码。

编码(以不同格式显示数据(和加密(提供机密性(之间有区别。密码用于加密。此外,我认为您出于保密原因想要加密数据。

是否有第三方功能可以满足我的需求?或者std函数可以通过某种方式实现这一点?

理论上,有些方法不需要填充。请查看不同的操作模式。存在不需要填充的模式(CTR、OFB、..(,有效地将块密码转换为流密码。

甚至还有专用的流密码,如Salsa或ChaCha。

所以,现在您可以将6字节的明文加密为6字节的密文。

当您需要发送与明文相同数量的加密数据时,会出现两个问题:

  • 为了在重复使用同一密钥进行多次加密的同时保持数据机密,每个密码都需要一些初始状态(IV(,它可以是随机的,也可以是计数器。不得重复使用相同的Key和IV。因此,在正常情况下,此计数器或状态会随加密数据一起发送。使用一些静态矢量可以破坏加密(部分或全部(。这就是评论中的人不能给你简单答案的原因。如果不传输额外的数据,就没有正确的加密。

  • 另一个问题是数据完整性。如果密文在传输中被修改(有意或无意(,接收方就无法检测数据是否被修改,而不发送额外的字节。我假设有6个字节就没有完整性控制,所以也许这不是你关心的问题。

通过移位和xor来实现这个指定的函数是幼稚的,还有更多吗?

是的,您可以使用静态IV向量对数据进行加密,但这并不像我们所理解的那样正确加密,因此知道多个消息或初始信息后,数据可能会被完全解密。

使用一些简单的东西,比如XOR、矩阵运算。。。还不如把钥匙本身露出来。