加解密算法分析--上海怡勝實訓中心

加解密算法,在我們軟件開發中進場使用。很多人對加解密算法只是聽過,沒有太多的使用。網上有很多介紹,不過沒有全面講解。作爲上海怡勝實訓中心經理,今天給大家做個介紹。

首先加解密算法分成一般開發中很少自己去設計實現,自己設計實現的算法可能存在自己很難發現的漏洞。而且設計實現也是非常耗費時間精力的,與其如此不如採用拿來主義。

從哪裏拿? openssl這個是一個開源的程序庫,也是跨平臺的。可以通過源碼安裝也可以下載安裝包安裝。安裝後記得下載一個openssl的使用手冊。《openssl開發手冊.chm

接下來,我們來看看加解密算法常用的有哪些種,每種的特點。

從是否可以還原原文角度分爲:可逆、不可逆。所謂可逆不可逆簡單講就是由原文加密成密文之後是否可以還原成原文。可以還原成原文的稱之爲可逆,不能還原成原文的稱之爲不可逆。可能會有不少人覺得不可逆算法爲什麼會存在,用來幹嘛呢?其實不可逆算法我們使用的也非常多,像我們的賬號密碼中的密碼一般都是採用不可逆的算法進行加密保存的。等要登錄的時候,再把用戶輸入的密碼也加密成密文,比較密文是否相同來驗證賬號密碼。這樣即使有人看到了用戶設置的密碼的密文,也沒辦法解析。

從加解密過程中使用的祕鑰是否相同,分爲對稱的和不對稱的。就是對稱的是加密和解密使用相同的key。那什麼是key呢?

那我們先看看加解密算法的基本模型

上面這個圖我們假設原文是241(在計算機裏面所有的信息都會被轉化成二進制的數字)。我們使用一個加密算法,就是把每個數字+key這裏假設的key1。那麼得出的密文就是352。如果想要解密的話,就必須知道key。否則沒辦法還原。當然世事無絕對有人可能會採用暴力方式嘗試key值,這個是後話。那麼解密的時候跟加密是相反的過程。


這樣就完成了一個解密的過程。這上面舉的例子也是一個對稱算法的例子,那麼費對稱算法是加解密的key值是不同的。這種key一般是分一個公鑰一個私鑰,而且是成對的,其實他們之間存在着一個耦合關係。這樣使用一個加密使用另一個解密。

那麼加解密算法常用的有哪些呢?

 

aes:對稱,高級加密算法

desdataencryption 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章