encryption - Golang AES ECB 加密

标签 encryption go aes ecb

尝试在 Go 中模拟一种基本上是 AES ECB 模式加密的算法。

这是我目前所拥有的

func Decrypt(data []byte) []byte {
    cipher, err := aes.NewCipher([]byte(KEY))
    if err == nil {
        cipher.Decrypt(data, PKCS5Pad(data))
        return data
    }
    return nil
}

我还有一个 PKCS5Padding 算法,它已经过测试并且可以工作,它首先填充数据。我找不到任何关于如何在 Go AES 包中切换加密模式的信息(它绝对不在 the docs 中)。

我有另一种语言的这段代码,这就是我知道这个算法不能正常工作的原因。

编辑:这是我在问题页面上解释的方法

func AESECB(ciphertext []byte) []byte {
    cipher, _ := aes.NewCipher([]byte(KEY))
    fmt.Println("AESing the data")
    bs := 16
    if len(ciphertext)%bs != 0     {
        panic("Need a multiple of the blocksize")
    }

    plaintext := make([]byte, len(ciphertext))
    for len(plaintext) > 0 {
        cipher.Decrypt(plaintext, ciphertext)
        plaintext = plaintext[bs:]
        ciphertext = ciphertext[bs:]
    }
    return plaintext
}

这实际上没有返回任何数据,也许我在将其从加密更改为解密时搞砸了

最佳答案

Electronic codebook ("ECB")是一种非常直接的操作模式。要加密的数据被分成字节 block ,所有字节 block 都具有相同的大小。对于每个 block ,应用一个密码,在本例中为 AES , 生成加密 block 。

下面的代码片段解密了 ECB 中的 AES-128 数据(注意 block 大小为 16 字节):

package main

import (
    "crypto/aes"
)

func DecryptAes128Ecb(data, key []byte) []byte {
    cipher, _ := aes.NewCipher([]byte(key))
    decrypted := make([]byte, len(data))
    size := 16

    for bs, be := 0, size; bs < len(data); bs, be = bs+size, be+size {
        cipher.Decrypt(decrypted[bs:be], data[bs:be])
    }

    return decrypted
}

正如@OneOfOne 所提到的,ECB 是不安全的并且很容易检测到,因为重复的 block 将始终加密为相同的加密 block 。这Crypto SE answer给出了很好的解释。

关于encryption - Golang AES ECB 加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072026/

相关文章:

MySql WorkBench AES 256 解密

python-3.x - SQLAlchemy:调用函数并始终将返回值保存在表中

arrays - 重构代码以惯用方式使用单个 channel

Linux 用户命名空间

java - Java 安全模块 KeyGenerator 线程安全吗?如果不是那么如何解决?

.net - 使用 Rijndael 或 AES 加密对值进行加盐是一种基本的良好做法吗?

ios - 我们的 iOS 应用拒绝说明

objective-c - 使用任何东西在 Objective-C 中加密/在 Ruby 中解密

Golang 文本高亮支持 Kate

php - 安全错误。在 php 中使用 ccavenue 检测到非法访问