加解密算法,在我们软件开发中进场使用。很多人对加解密算法只是听过,没有太多的使用。网上有很多介绍,不过没有全面讲解。作为上海怡胜实训中心经理,今天给大家做个介绍。
首先加解密算法分成一般开发中很少自己去设计实现,自己设计实现的算法可能存在自己很难发现的漏洞。而且设计实现也是非常耗费时间精力的,与其如此不如采用拿来主义。
从哪里拿? openssl这个是一个开源的程序库,也是跨平台的。可以通过源码安装也可以下载安装包安装。安装后记得下载一个openssl的使用手册。《openssl开发手册.chm》
接下来,我们来看看加解密算法常用的有哪些种,每种的特点。
从是否可以还原原文角度分为:可逆、不可逆。所谓可逆不可逆简单讲就是由原文加密成密文之后是否可以还原成原文。可以还原成原文的称之为可逆,不能还原成原文的称之为不可逆。可能会有不少人觉得不可逆算法为什么会存在,用来干嘛呢?其实不可逆算法我们使用的也非常多,像我们的账号密码中的密码一般都是采用不可逆的算法进行加密保存的。等要登录的时候,再把用户输入的密码也加密成密文,比较密文是否相同来验证账号密码。这样即使有人看到了用户设置的密码的密文,也没办法解析。
从加解密过程中使用的秘钥是否相同,分为对称的和不对称的。就是对称的是加密和解密使用相同的key。那什么是key呢?
那我们先看看加解密算法的基本模型
上面这个图我们假设原文是241(在计算机里面所有的信息都会被转化成二进制的数字)。我们使用一个加密算法,就是把每个数字+key这里假设的key为1。那么得出的密文就是352。如果想要解密的话,就必须知道key。否则没办法还原。当然世事无绝对有人可能会采用暴力方式尝试key值,这个是后话。那么解密的时候跟加密是相反的过程。
这样就完成了一个解密的过程。这上面举的例子也是一个对称算法的例子,那么费对称算法是加解密的key值是不同的。这种key一般是分一个公钥一个私钥,而且是成对的,其实他们之间存在着一个耦合关系。这样使用一个加密使用另一个解密。
那么加解密算法常用的有哪些呢?
aes:对称,高级加密算法
des:dataencryption standard对称算法
rsa: 非对称
MD5:不可逆,概述算法
加密算法本质是把数据信息由明文转变成密文的一个过程。这个过程其实本质并不复杂,基本上每个人都可以想到一个办法来完成这件事情。例如:我们把所有的数字实际对应做一个变化。
其实可以自己编写加解密算法,并不难,但考虑到实际开发的安全性,一般不建议自己开发。所以大多情况会采用现成的开源算法。像opensll算法可以根据openssl手册来调用。
以上几种各自有相应的调用。
以上几种各自有相应的调用。
例如aes算法:aes.c
/*
Copyright (c) 2016-2017 .
This product includes cryptographicsoftware written by
上海怡胜信息科技有限公司
www.ysitroad.com
*/
#include <stdio.h>
#include <openssl/aes.h>
#include <unistd.h>
#include <string.h>
int aes_encrypt(char *in, char *key,char *out) //, int olen)
{
if(!in || !key || !out)
return0;
AES_KEY aes;
if (AES_set_encrypt_key((unsigned char*)key, 128, &aes) < 0) {
return 0;
}
intlen = strlen(in), en_len = 0;
while(en_len < len) //输入输出字符串够长,并且是AES_BLOCK_SIZE的整数倍,需要严格限制
{
AES_encrypt((unsignedchar *)in, (unsigned char *)out, &aes);
in+= AES_BLOCK_SIZE;
out+= AES_BLOCK_SIZE;
en_len+= AES_BLOCK_SIZE;
}
returnen_len;
}
int aes_decrypt(char *in, char *key,char *out,int len)
{
if(!in || !key || !out)
return0;
AES_KEYaes;
if(AES_set_decrypt_key((unsigned char *)key, 128, &aes) < 0) {
return0;
}
int en_len = 0;
while(en_len < len) {
AES_decrypt((unsignedchar *)in, (unsigned char *)out, &aes);
in+= AES_BLOCK_SIZE;
out+= AES_BLOCK_SIZE;
en_len+= AES_BLOCK_SIZE;
}
return1;
}
int main()
{
charbuf[1024] = "shanghai yisheng test!!";
charobuf[1024];
charbuf2[1024];
intlen;
inti;
len =aes_encrypt(buf,"key1",obuf);
//printf("encode:%s\n",obuf);
for(i=0;i<len;i++)
{
printf("%02x",(unsigned char)obuf[i]);
}
printf("\n\n");
aes_decrypt(obuf,"key1",buf2,len);
printf("decode:%s\n",buf2);
}
DES算法:des.c
/*
Copyright (c) 2016-2017 .
This product includes cryptographic software written by
上海怡胜信息科技有限公司
www.ysitroad.com
*/
#include <stdio.h>
#include <openssl/des.h>
#include <string.h>
int main(int argc, char **argv)
{
DES_cblock key;
char buf[1024];
char obuf[1024];
//const_DES_cblock input = buf;
DES_cblock input;
DES_cblock output;
int i;
DES_key_schedule schedule;
/* DES_random_key(&key); *//* generate a random key */
DES_string_to_key("pass", &key);
DES_set_key_checked(&key, &schedule);
//input string
scanf("%s",buf);
printf("cleartext:%s \n", buf);
//encrypt
DES_ecb_encrypt((void *)buf,(void*) output, &schedule, DES_ENCRYPT);
printf("Encrypted! ");
//output encode
printf("ciphertext:");
for (i = 0; i < sizeof(output); i++)
printf("%02x",output[i]);
printf(" \n");
memset(buf,0,1024);
//decrypt
DES_ecb_encrypt((void *)output,(void *)buf, &schedule, DES_DECRYPT);
printf("Decrypted! ");
printf("cleartext:%s \n", buf);
return 0;
}
具体的调用可以看一下手册。根据手册来。可以加群:378333774。