sunfull 发表于 2018-9-21 07:21:20

openssl:AES CBC PKCS5 加解密 (C/GOLANG)

#include   /* 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;
  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;
  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;
  *outLen = srcLen - unpadding;
  char *out = (char *)malloc(*outLen);
  memcpy(out, tmp, *outLen);
  free(tmp);
  return (unsigned char*)out;
  }

页: [1]
查看完整版本: openssl:AES CBC PKCS5 加解密 (C/GOLANG)