openssl是一个加密库,封装了多个算法,我们这里使用的是DES算法CBC模式。
一、准备OPENSSL的LINUX及C#库
openssl项目地址:
C#下使用自带库
二、操作函数
在C#下加密解密:
using System.Text;
using System.IO;
using System.Security.Cryptography;
DES des_cbc = new DESCryptoServiceProvider();
public byte[] key_b;
public byte[] iv_b;
/// <summary>初始化</summary>
/// <param name="key">密钥</param>
/// <param name="vi">向量</param>
public void init(string key, string vi)
{
key_b = ASCIIEncoding.UTF8.GetBytes(key); //密钥
iv_b = ASCIIEncoding.UTF8.GetBytes(vi); //初始化向量
des_cbc.Mode = CipherMode.CBC;
des_cbc.Padding = PaddingMode.Zeros;
}
/// <summary>DES加密CBC模式0补齐</summary>
/// <param name="input">明文</param>
public byte[] ecrypt(byte[] input)
{
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des_cbc.CreateEncryptor(key_b, iv_b), CryptoStreamMode.Write);
cs.Write(input, 0, input.Length);
cs.Close();
byte[] ciphertext = ms.ToArray();
return ciphertext;
}
/// <summary>DES解密CBC模式0补齐</summary>
/// <param name="input">明文</param>
public byte[] decrypt(byte[] input)
{
MemoryStream ms = new MemoryStream();
CryptoStream cs = new CryptoStream(ms, des_cbc.CreateDecryptor(key_b, iv_b), CryptoStreamMode.Write);
cs.Write(input, 0, input.Length);
cs.FlushFinalBlock();
byte[] ciphertext = ms.ToArray();
return ciphertext;
}
在LINUX下压缩解压:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/des.h>
// DES-CBC加密方式 * 8位密钥,加密内容8位补齐,补齐方式为填充0
int main(int argc, char *argv[])
{
unsigned char buff[20]={"123412341234"};
unsigned char encry_buff[20] ;
int packet_len = strlen(buff);
int i;
int encry_len;
memset(encry_buff,0,20);
//密钥
DES_cblock KEY_DES = "pk$@gtjt";
//加密向量
DES_cblock ivec = "thvn#&@@";
//解密向量
DES_cblock ivec_de = "thvn#&@@";
DES_key_schedule schedule;
DES_set_key_unchecked((const_DES_cblock*)KEY_DES, &schedule);
encry_len = (strlen(buff)+7)/8*8;//长度
unsigned char *output=(char*)malloc(encry_len);
//加密
memset(output,0,strlen(output));
DES_ncbc_encrypt(buff, output, strlen(buff), &schedule, &ivec, DES_ENCRYPT);
//解密
memset(buff,0,20);
DES_ncbc_encrypt(output, buff, strlen(output), &schedule, &ivec_de, DES_DECRYPT);
free(output);
return 0;
}