为了账号安全,请及时绑定邮箱和手机立即绑定

需要aes密码功能允许输入[6]字节

需要aes密码功能允许输入[6]字节

Go
缥缈止盈 2022-10-24 15:51:27
背景需要一种可以编码和解码[6]字节的密码。std 函数 aes.NewCipher 不允许这样做,因为它的块大小定义是 16 字节。不能简单地将 6 个字节填充到 16 个字节。我需要打印 [6]byte 作为条形码并使用条形码进行远程和远程解码。代码这可以在去操场上运行// You can edit this code!// Click here and start typing.package mainimport (    "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)    }}错误:加密/aes:输入未满块问题是否有第三方功能可以满足我的要求?或者 std 函数可以以某种方式实现这一点?通过位移和异或来实现这个指定的功能很幼稚,还有更多吗?对于新的,我已经用位移实现了这个功能。
查看完整描述

1 回答

?
POPMUISE

TA贡献1765条经验 获得超5个赞

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

编码(以不同格式显示数据)和加密(提供机密性)之间存在差异。密码用于加密。此外,我假设您出于保密原因想要加密数据。

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

理论上 - 有些方法不需要填充。请参阅不同的操作模式。有些模式(CTR、OFB、..)不需要填充,从而有效地将块密码转换为流密码。

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

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

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

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

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

通过位移和异或来实现这个指定的功能很幼稚,还有更多吗?

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

使用 XOR、矩阵运算等简单的东西……也可以揭示密钥本身。


查看完整回答
反对 回复 2022-10-24
  • 1 回答
  • 0 关注
  • 91 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信