20155325 2017-2018 1 《信息安全系統設計基礎》實驗五 通訊協議設計
實驗五 通訊協議設計-1
實驗要求
在Ubuntu中完成 http://www.cnblogs.com/rocedu/p/5087623.html 中的作業
提交運行結果截圖
實驗截圖
碼雲鏈接
link
實驗五 通訊協議設計-2
實驗要求
在Ubuntu中實現對實驗二中的“wc服務器”通過混合密碼系統進行防護
提交測試截圖
實驗截圖
碼雲鏈接
link
知識點
- OpenSSL
OpenSSL 是一個安全套接字層密碼庫,囊括主要的密碼算法、常用的密鑰和證書封裝管理功能及SSL協議,並提供豐富的應用程序供測試或其它目的使用。
OpenSSL被曝出現嚴重安全漏洞後,發現多數通過SSL協議加密的網站使用名為OpenSSL的開源軟件包。OpenSSL漏洞不僅影響以https開頭的網站,黑客還可利用此漏洞直接對個人電腦發起“心臟出血”(Heartbleed)攻擊。據分析,Windows上有大量軟件使用了存在漏洞的OpenSSL代碼庫,可能被黑客攻擊抓取用戶電腦上的內存數據。
- 對稱加密算法
DES算法,3DES算法,TDEA算法,Blowfish算法,RC5算法,IDEA算法
對稱加密算法是應用較早的加密算法,技術成熟。在對稱加密算法中,數據發信方將明文(原始數據)和加密密鑰(mi yao)一起經過特殊加密算法處理後,使其變成復雜的加密密文發送出去。收信方收到密文後,若想解讀原文,則需要使用加密用過的密鑰及相同算法的逆算法對密文進行解密,才能使其恢復成可讀明文。在對稱加密算法中,使用的密鑰只有一個,發收信雙方都使用這個密鑰對數據進行加密和解密,這就要求解密方事先必須知道加密密鑰。
- RSA算法
算法詳情推薦閱讀
RSA算法原理(一)
RSA算法原理(二)
- 哈希算法
哈希算法將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的,所以數據的哈希值可以檢驗數據的完整性。一般用於快速查找和加密算法。
簡單解釋:哈希(Hash)算法,即散列函數。它是一種單向密碼體制,即它是一個從明文到密文的不可逆的映射,只有加密過程,沒有解密過程。同時,哈希函數可以將任意長度的輸入經過變化以後得到固定長度的輸出。哈希函數的這種單向特征和輸出數據長度固定的特征使得它可以生成消息或者數據。
class GeneralHashFunctionLibrary
{/*RSHash*/
public long RSHash(String str)
{
int b = 378551;
int a = 63689;
long hash = 0;
for(int i = 0; i < str.length(); i++)
{
hash = hash * a + str.charAt(i);
a = a * b;
}
return hash;
}
/*JSHash*/
public long JSHash(String str)
{
long hash = 1315423911;
for(int i = 0; i < str.length(); i++)
hash ^= ((hash << 5) + str.charAt(i) + (hash >> 2));
return hash;
}
/*PJWHash*/
public long PJWHash(String str)
{
long BitsInUnsignedInt = (long)(4 * 8);
long ThreeQuarters = (long)((BitsInUnsignedInt * 3) / 4);
long OneEighth = (long)(BitsInUnsignedInt / 8);
long HighBits = (long)(0xFFFFFFFF)<<(BitsInUnsignedInt-OneEighth);
long hash = 0;
long test = 0;
for(int i = 0; i < str.length(); i++)
{
hash = (hash << OneEighth) + str.charAt(i);
if((test = hash & HighBits) != 0)
hash = ((hash ^ (test >> ThreeQuarters)) & (~HighBits));
}
return hash;
}
/*ELFHash*/
public long ELFHash(String str)
{
long hash = 0;
long x = 0;
for(int i = 0; i < str.length(); i++)
{
hash = (hash << 4) + str.charAt(i);
if(( x = hash & 0xF0000000L) != 0)
hash ^= ( x >> 24);
hash &= ~x;
}
return hash;
}
/*BKDRHash*/
public long BKDRHash(String str)
{
long seed = 131;//31131131313131131313etc..
long hash = 0;
for(int i = 0; i < str.length(); i++)
hash = (hash * seed) + str.charAt(i);
return hash;
}
/*SDBMHash*/
public long SDBMHash(String str)
{
long hash = 0;
for(int i = 0; i < str.length(); i++)
hash = str.charAt(i) + (hash << 6) + (hash << 16) - hash;
return hash;
}
/*DJBHash*/
public long DJBHash(String str)
{
long hash = 5381;
for(int i = 0; i < str.length(); i++)
hash = ((hash << 5) + hash) + str.charAt(i);
return hash;
}
/*DEKHash*/
public long DEKHash(String str)
{
long hash = str.length();
for(int i = 0; i < str.length(); i++)
hash = ((hash << 5) ^ (hash >> 27)) ^ str.charAt(i);
return hash;
}
/*BPHash*/
public long BPHash(String str)
{
long hash=0;
for(int i = 0;i < str.length(); i++)
hash = hash << 7 ^ str.charAt(i);
return hash;
}
/*FNVHash*/
public long FNVHash(String str)
{
long fnv_prime = 0x811C9DC5;
long hash = 0;
for(int i = 0; i < str.length(); i++)
{
hash *= fnv_prime;
hash ^= str.charAt(i);
}
return hash;
}
/*APHash*/
long APHash(String str)
{
long hash = 0xAAAAAAAA;
for(int i = 0; i < str.length(); i++)
{
if((i & 1) == 0)
hash ^=((hash << 7) ^ str.charAt(i) ^ (hash >> 3));
else
hash ^= (~((hash << 11) ^ str.charAt(i) ^ (hash >> 5)));
}
return hash;
}
}
實驗遇到的問題及解決方法
- 問題1:復制兩個包失敗
- 解決:要復制到的文件夾必須存在才可以,文件可以新創建
鏈接:
cp命令
- 問題2:隨機數
- 解決:
OpenSSL使用指南
- 問題3:生成私鑰、公鑰
- 解決: 如何使用openssl生成RSA公鑰和私鑰對
參考鏈接
- 2017-2018-1 《信息安全系統設計基礎》實驗五 通信協議設計
- RSA算法原理(一)
- RSA算法原理(二)
- 對稱加密算法
- RSA算法
- cp命令
- OpenSSL使用指南
- 如何使用openssl生成RSA公鑰和私鑰對
20155325 2017-2018 1 《信息安全系統設計基礎》實驗五 通訊協議設計