openssl:AES CBC PKCS5 加解密 (C/GOLANG)
#include <openssl/aes.h>
/* AES_CBC_PKCS5_Encrypt
* 入参:
* src:明文
* srcLen:明文长度
* key:密钥 长度只能是16/24/32字节 否则OPENSSL会对key进行截取或PKCS0填充
* keyLen:密钥长度
* outLen:密文长度
* 返回值:
* 密文 需要free
*/
unsigned char *AES_CBC_PKCS5_Encrypt(unsigned char *src, int srcLen, unsigned char *key, int keyLen, int *outLen)
{
int blockCount = 0;
int quotient = srcLen / AES_BLOCK_SIZE;
int mod = srcLen % AES_BLOCK_SIZE;
blockCount = quotient + 1;
int padding = AES_BLOCK_SIZE - mod;
char *in = (char *)malloc(AES_BLOCK_SIZE*blockCount);
memset(in, padding, AES_BLOCK_SIZE*blockCount);
memcpy(in, src, srcLen);
//out
char *out = (char *)malloc(AES_BLOCK_SIZE*blockCount);
memset(out, 0x00, AES_BLOCK_SIZE*blockCount);
*outLen = AES_BLOCK_SIZE*blockCount;
//初始向量为全0
unsigned char iv[AES_BLOCK_SIZE];
memset(iv, 0x00, AES_BLOCK_SIZE);
//开始加密
AES_KEY aes;
if (AES_set_encrypt_key((unsigned char*)key, keyLen*8, &aes) < 0)
{
printf("AES_set_encrypt_key error\n");
return NULL;
}
AES_cbc_encrypt((unsigned char*)in, (unsigned char*)out, AES_BLOCK_SIZE*blockCount, &aes, iv, AES_ENCRYPT);
free(in);
return (unsigned char*)out;
}
/* AES_CBC_PKCS5_Decrypt
* 入参:
* src:密文
* srcLen:密文长度
* key:密钥 长度只能是16/24/32字节 否则OPENSSL会对key进行截取或PKCS0填充
* keyLen:密钥长度
* outLen:明文长度
* 返回值:
* 明文 需要free
*/
unsigned char *AES_CBC_PKCS5_Decrypt(unsigned char *src, int srcLen, unsigned char *key, int keyLen, int *outLen)
{
//初始向量为全0
unsigned char iv[AES_BLOCK_SIZE];
memset(iv, 0x00, AES_BLOCK_SIZE);
//开始加密
AES_KEY aes;
if (AES_set_decrypt_key((unsigned char*)key, keyLen * 8, &aes) < 0)
{
return NULL;
}
char *tmp = (char *)malloc(srcLen);
memset(tmp, 0x00, srcLen);
AES_cbc_encrypt((unsigned char*)src, (unsigned char*)tmp, srcLen, &aes, iv, AES_DECRYPT);
//PKCS5 UNPADDING
int unpadding = tmp[srcLen - 1];
*outLen = srcLen - unpadding;
char *out = (char *)malloc(*outLen);
memcpy(out, tmp, *outLen);
free(tmp);
return (unsigned char*)out;
}
package crypto
import (
"crypto/aes"
"crypto/cipher"
"errors"
)
//AESDecrypt AES加密 初始向量16字节空 PKCS5 CBC
//入参:src 待加密[]byte
// key:密钥[]byte 16/24/32
// 返回:加密后[]byte
func AESEncrypt(src, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
src = pkcs5Padding(src, block.BlockSize())
srcLen := len(src)
if srcLen%block.BlockSize() != 0 {
return nil, errors.New("Need a multiple of the blocksize")
}
dst := make([]byte, srcLen)
iv := make([]byte, 16)
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(dst, src)
return dst, nil
}
//AESEncrypt AES解密 初始向量16字节空 PKCS5 CBC
//入参:src 已加密[]byte
// key:密钥[]byte 16/24/32
// 返回:解密后[]byte
func AESDecrypt(src, key []byte) ([]byte, error) {
block, err := aes.NewCipher(key)
if err != nil {
return nil, err
}
srcLen := len(src)
if srcLen%block.BlockSize() != 0 {
return nil, errors.New("crypto/cipher: input not full blocks")
}
dst := make([]byte, srcLen)
iv := make([]byte, 16)
mode := cipher.NewCBCDecrypter(block, iv)
mode.CryptBlocks(dst, src)
return pkcs5UnPadding(dst), nil
}
func pkcs5Padding(ciphertext []byte, blockSize int) []byte {
padding := blockSize - len(ciphertext)%blockSize
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
return append(ciphertext, padtext...)
}
func pkcs5UnPadding(origData []byte) []byte {
length := len(origData)
// 去掉最后一个字节 unpadding 次
unpadding := int(origData[length-1])
return origData[:(length - unpadding)]
}
openssl:AES CBC PKCS5 加解密 (C/GOLANG)的更多相关文章
- golang 3des/ecb/cbc/pkcs5 加解密
本人新手,参考文档: http://blog.studygolang.com/2013/01/go%E5%8A%A0%E5%AF%86%E8%A7%A3%E5%AF%86%E4%B9%8Bdes/ h ...
- AES CBC/CTR 加解密原理
So, lets look at how CBC works first. The following picture shows the encryption when using CBC (in ...
- Java 使用AES/CBC/PKCS7Padding 加解密字符串
介于java 不支持PKCS7Padding,只支持PKCS5Padding 但是PKCS7Padding 和 PKCS5Padding 没有什么区别要实现在java端用PKCS7Padding填充, ...
- JAVA AES CBC PKCS5Padding加解密
package com.hzxc.groupactivity.util; /** * Created by hdwang on 2019/1/17. */ import org.slf4j.Logge ...
- C++ 和 java 使用 AES CBC 128 加解密
Java 使用jce, code: import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; import javax ...
- python 实现 AES CBC模式加解密
AES加密方式有五种:ECB, CBC, CTR, CFB, OFB 从安全性角度推荐CBC加密方法,本文介绍了CBC,ECB两种加密方法的python实现 python 在 Windows下使用AE ...
- 手机号的 AES/CBC/PKCS7Padding 加解密
前言:接口中上次的手机号码和密码是传入的加密的,模拟自动化的时候也需要先对数据进行加密 1.各种语言实现 网上已经各种语言实现好的AES加密,可以点击查看:http://outofmemory.cn/ ...
- golang AES/ECB/PKCS5 加密解密 url-safe-base64
因为项目的需要用到golang的一种特殊的加密解密算法AES/ECB/PKCS5,但是算法并没有包含在标准库中,经过多次失败的尝试,终于解码成功,特此分享: /* 描述 : golang AES/EC ...
- python 实现 AES ECB模式加解密
AES ECB模式加解密使用cryptopp完成AES的ECB模式进行加解密. AES加密数据块分组长度必须为128比特,密钥长度可以是128比特.192比特.256比特中的任意一个.(8比特 == ...
随机推荐
- Docker 容器和镜像使用
Docker 容器使用: docker run -d -P training/webapp python app.py -d:让容器在后台运行. -P:将容器内部使用的网络端口映射到我们使用的主机上. ...
- C# WinForm通用皮肤
最近做一个小项目,是以前的一个旧项目改造升级,添加些新功能需要用到c#来开发, 话说最近2年都在用Qt开发,c#都生疏不少,赶紧捡起来, 看到原来的就知道需要重新设计,所有打算找一款通用皮肤省事 下面 ...
- Tomcat和JDK版本的对应关系
当我们在谈论Tomcat与JDK版本的对应关系的时候,我们实际上在讨论两个问题. 第一个是,我们想安装了某个版本的Tomcat(比如Tomcat7),需要安装哪个版本的JDK,才能把Tomcat运行起 ...
- Linux/AIX/Windows端口和进程互查
经常我们需要通过端口号查是哪个进程占用,或想查看某个进程占用了哪些端口. 1.1Linux上通过端口查找进程 比如我们想知道当前系统中80端口是哪个进程所占用 netstat -anp| |more ...
- Java连接Oracle/MySQL数据库教程
一.下载 oracle java驱动下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/jdbc-112010-090 ...
- java多线程读一个变量需要加锁吗?
如果只是读操作,没有写操作,则可以不用加锁,此种情形下,建议变量加上final关键字: 如果有写操作,但是变量的写操作跟当前的值无关联,且与其他的变量也无关联,则可考虑变量加上volatile关键字, ...
- PyQt+Html+Js
先做记录,后面有时间在仔细研究 https://www.cnblogs.com/jiangjh5/p/7209315.html?utm_source=itdadao&utm_medium=re ...
- CentOS下安装JDK-rpm文件
1.下载JDK,下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html. 测试 ...
- C#如何通过反射调用类下的方法
首先模拟一个mvc的项目,创建一个业务类(HomeService),在类下创建3个方法 public class HomeService { /// <summary> /// 无参方法 ...
- ubuntu14.04 解析不了域名—ubuntu的DNS配置
问题描述: 电脑系统为ubuntu14.04,连上无线后,火狐浏览器打开www.baidu.com,提示找不到服务器,以及终端ping www.baidu.com,提示unkown host,但是浏览 ...