go 的des加解密

go 的crypto/des里面只有cbc模式的


如果使用ecb模式的, 需要自己写。

代码如下

// PKCS5Padding func
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
//padtext := bytes.Repeat([]byte{0}, padding)
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}


// PKCS5Unpadding func
func PKCS5Unpadding(origData []byte) []byte {
length := len(origData)
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}


// desEncrypt func
func DESEncryptECB(key []byte, src []byte) []byte {
desBlockEncrypter, err := des.NewCipher(key[0:8])
if err != nil {
panic(err)
}


bs := desBlockEncrypter.BlockSize()
srcPadding := PKCS5Padding(src, bs)
out := make([]byte, len(srcPadding))
dst := out
for len(srcPadding) > 0 {
desBlockEncrypter.Encrypt(dst, srcPadding[:bs])
srcPadding = srcPadding[bs:]
dst = dst[bs:]
}


return out
}


// desDecrypt func
func DESDecryptECB(key []byte, src []byte) []byte {
desBlockDecrypter, err := des.NewCipher(key[0:8])
if err != nil {
panic(err)
}


bs := desBlockDecrypter.BlockSize()
out := make([]byte, len(src))
dst := out
for len(src) > 0 {
desBlockDecrypter.Decrypt(dst, src[:bs])
src = src[bs:]
dst = dst[bs:]
}


out = PKCS5Unpadding(out)


return out

}


ps: 逻辑流程绝无问题, 细节上还需要修改下, 原因是
加解密过程中, 可能由于数据是伪造的、导致计算过程中的slice越界。。

### Go语言中的DES加密与解密Go语言中,可以利用标准库`crypto/des`和`crypto/cipher`来实现DES算法的加解密功能。以下是关于如何使用这些包的具体说明以及代码示例。 #### DES简介 DES(Data Encryption Standard),即数据加密标准,是一种对称加密算法。它通过相同的密钥完成加密和解密操作[^1]。需要注意的是,由于DES的安全性较低,在实际应用中通常推荐更安全的AES替代方案。 #### 密码块模式的选择 为了更好地支持不同的应用场景,可以选择密码分组链接模式(CBC Mode)。这种模式下,明文被分成固定大小的数据块,并且每个数据块都依赖于前一数据块的结果进行处理[^2]。 下面是一个完整的基于CBC模式下的DES加解密函数实现: ```go package main import ( "crypto/cipher" "crypto/des" "encoding/base64" "fmt" ) // PKCS5Padding 填充方式 func PKCS5Padding(src []byte, blockSize int) []byte { padding := blockSize - len(src)%blockSize padText := bytes.Repeat([]byte{byte(padding)}, padding) return append(src, padText...) } // PKCS5Unpadding 移除填充 func PKCS5Unpadding(src []byte) ([]byte, error) { length := len(src) if length == 0 { return nil, fmt.Errorf("encryption/decryption failed") } unpadding := int(src[length-1]) if unpadding > length || unpadding == 0 { return nil, fmt.Errorf("invalid padding size") } return src[:length-unpadding], nil } // DesEncrypt 使用DES-CBC模式加密字符串 func DesEncrypt(orig string, key []byte) (string, error) { block, err := des.NewCipher(key) if err != nil { return "", err } origData := []byte(orig) origData = PKCS5Padding(origData, block.BlockSize()) blockMode := cipher.NewCBCEncrypter(block, key) crypted := make([]byte, len(origData)) blockMode.CryptBlocks(crypted, origData) return base64.StdEncoding.EncodeToString(crypted), nil } // DesDecrypt 使用DES-CBC模式解密字符串 func DesDecrypt(crypted string, key []byte) (string, error) { block, err := des.NewCipher(key) if err != nil { return "", err } ciphertext, _ := base64.StdEncoding.DecodeString(crypted) if len(ciphertext) < block.BlockSize() { return "", fmt.Errorf("ciphertext too short") } blockMode := cipher.NewCBCDecrypter(block, key) orig := make([]byte, len(ciphertext)) blockMode.CryptBlocks(orig, ciphertext) orig, err = PKCS5Unpadding(orig) if err != nil { return "", err } return string(orig), nil } func main() { key := []byte("12345678") // DES密钥长度必须为8字节 plaintext := "hello world" encryptedStr, encryptErr := DesEncrypt(plaintext, key) if encryptErr != nil { fmt.Println("Encryption Error:", encryptErr) } else { fmt.Printf("Encrypted String: %s\n", encryptedStr) decryptedStr, decryptErr := DesDecrypt(encryptedStr, key) if decryptErr != nil { fmt.Println("Decryption Error:", decryptErr) } else { fmt.Printf("Decrypted String: %s\n", decryptedStr) } } } ``` 上述程序展示了如何创建一个简单的DES CBC模式加解密工具。其中包含了必要的填充(PKCS5 Padding),并采用Base64编码以方便传输和存储结果[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值