curses-鍵盤編碼-openssl加解密【轉】

本文轉載自;https://zhuanlan.zhihu.com/p/26164115linux

1.1 鍵盤編碼

按鍵過程:
當用戶按下某個鍵時,git

1.鍵盤會檢測到這個動做,並經過鍵盤控制器把掃描碼(scan code)傳送到計算機;鍵盤掃描碼跟具體的硬件有關的,不一樣廠商對同一個鍵的掃描碼有可能不一樣。
2.計算機接收到掃描碼後,將其交給鍵盤驅動程序;
3.鍵盤驅動程序把這個掃描碼轉換爲鍵盤虛擬碼;虛擬碼與具體硬件無關,不一樣廠商的鍵盤,同一個鍵的虛擬碼老是相同的。而後,鍵盤驅動程序把該鍵盤操做的掃描碼和虛擬碼以及其它信息傳遞給操做系統;
4.操做系統將得到的信息封裝在一個鍵盤消息中,並把該鍵盤消息插入到消息列隊。
5.經過Windows的消息系統,該鍵盤消息被送到某個窗口中;
6.窗口所在的應用程序接收到消息後,能夠了解到有關鍵盤操做的信息,而後決定做出必定的響應。算法

在Linux下,能夠經過自帶的showkey來獲取:編程

showkey --help
showkey 版本 1.15.5
用法: showkey [選項...]
有效的選項:
    -h --help   顯示此幫助文本
    -a --ascii  顯示鍵的十進制/八進制/十六進制值
    -s --scancodes  只顯示原始掃描碼
    -k --keycodes   只顯示翻譯後的鍵碼(默認)

KeyCode參數是指的鍵代碼,也就是虛擬碼。它用來在系統中標識一個鍵,注意,僅僅用於在系統中標識。咱們一般不是直接用這個代碼(數字,直接用仍是很很差記憶),而是將它定義爲字符常量,好比在curses庫裏,能夠發現對每一個鍵的相應定義,#define KEY_DOWN 0402。須要說明的是,每一個鍵的虛擬碼都是惟一的,也就是不區分大小寫,只用來表示一個位置,而不表示鍵的狀態。
KeyAscii參數就比較容易理解了,固然就是鍵的ascii碼,強調錶示一個字符,而不是強調鍵。某些按鍵,好比方向鍵,是由於這些鍵沒有傳統意義上的Ascii碼(這些鍵只有虛擬碼),因此須要用多個ascii碼組合,好比F2: ^[OQ
scancodes是指掃描碼,安全

鍵盤上的每個鍵都有兩個惟一的數值進行標誌。爲何要用兩個數值而不是一個數值呢?這是由於一個鍵能夠被按下,也能夠被釋放。當一個鍵按下時,它們產生一個惟一的數值,當一個鍵被釋放時,它也會產生一個惟一的數值,咱們把這些數值都保存在一張表裏面,到時候經過查表就能夠知道是哪個鍵被敲擊,而且能夠知道是它是被按下仍是被釋放了。這些數值在系統中被稱爲鍵盤掃描碼。函數

1.2 加密解密

1.2.1 單向加密

只能加密,不能解密,不可逆。常見的有:MD5(Message Digest algorithm 5,信息摘要算法)、SHA(Secure Hash Algorithm,安全散列算法)、HMAC(Hash Message Authentication Code,散列消息鑑別碼)。工具

1.2.2 對稱加密

對稱加密(也叫私鑰加密)指加密和解密使用相同密鑰的加密算法。有時又叫傳統密碼算法,就是加密密鑰和解密密鑰是相同的,或者加密/解密密鑰可以從解密/加密密鑰中推算出來,因此也稱這種加密算法爲祕密密鑰算法或單密鑰算法。
常見的有DES、AES、RC系列算法。ui

1.2.3 非對稱加密

非對稱加密算法(asymmetric cryptographic algorithm)又名「公開密鑰加密算法」。常見:RSA、DSA等算法。編碼

2.實驗

本次實驗我主要藉助linux自帶的showkey工具實現了鍵盤編碼的輸出,利用openssl庫實現了md五、sha一、rsa加密解密。使用curses庫作了菜單。加密

2.1 鍵盤編碼

showkey是linux keyboard 工具集合中的一個,代碼開源,,能夠看出它主要是經過和鍵盤設備進行交互,獲取鍵的編碼值。
ascii編碼,

掃描碼,能夠看到是兩個編碼,按下和釋放兩種狀態。

2.2 加密解密

2.2.1 md5和SHA加密

實際上,他們都不算是真正的加密算法,更準確的是一種哈希算法,經過散列算法,變換成固定長度的輸出,是一種壓縮映射,散列值的空間一般遠小於輸入的空間。 簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。


SHA1和MD5的算法都是從MD4算法改進而來的2種算法,基本思路都是將信息分紅N個分組,每組64個字節,每一個分組都進行摘要運算。當一個分組的摘要運算完畢後,將上一個分組的結果也用於下一個分組的運算。

2.2.2 rsa 非對稱加密算法

1976年之前,全部的加密方法都是同一種模式:
(1)甲方選擇某一種加密規則,對信息進行加密;
(2)乙方使用同一種規則,對信息進行解密。
因爲加密和解密使用一樣規則(簡稱」密鑰」),這被稱爲」對稱加密算法」(Symmetric-key algorithm)。
這種加密模式有一個最大弱點:甲方必須把加密規則告訴乙方,不然沒法解密。
而」非對稱加密算法」。
(1)乙方生成兩把密鑰(公鑰和私鑰)。公鑰是公開的,任何人均可以得到,私鑰則是保密的。
(2)甲方獲取乙方的公鑰,而後用它對信息加密。
(3)乙方獲得加密後的信息,用私鑰解密。
若是公鑰加密的信息只有私鑰解得開,那麼只要私鑰不泄漏,通訊就是安全的。
本次實驗我利用openssl這個庫裏的rsa函數進行了加密解密。主要步驟以下:
生成一個密鑰(包含公鑰和私鑰),而後將公鑰提取出來

openssl genrsa -out test.key 1024
openssl rsa -in test.key -pubout -out test_pub.key

就能夠利用生成的密鑰進行加密解密了。

幾個關鍵詞

密鑰流:RC4算法的關鍵是根據明文和密鑰生成相應的密鑰流,密鑰流的長度和明文的長度是對應的,也就是說明文的長度是500字節,那麼密鑰流也是500字節。固然,加密生成的密文也是500字節,由於密文第i字節=明文第i字節^密鑰流第i字節;
狀態向量S:長度爲256,S[0],S[1]…..S[255]。每一個單元都是一個字節,算法運行的任什麼時候候,S都包括0-255的8比特數的排列組合,只不過值的位置發生了變換;
臨時向量T:長度也爲256,每一個單元也是一個字節。若是密鑰的長度是256字節,就直接把密鑰的值賦給T,不然,輪轉地將密鑰的每一個字節賦給T;
密鑰K:長度爲1-256字節,注意密鑰的長度keylen與明文長度、密鑰流的長度沒有必然關係,一般密鑰的長度取爲16字節(128比特)。

RC4的原理分爲三步
1. 初始化S和T

for i=0 to 255 do
   S[i]=i;
   T[i]=K[ i mod keylen ];
  1. 初始排列S
j=0;
for i=0 to 255 do
   j= ( j+S[i]+T[i])mod256;
   swap(S[i],S[j]);
  1. 產生密鑰流
i,j=0;
for r=0 to len do  //r爲明文長度,r字節
   i=(i+1) mod 256;
   j=(j+S[i])mod 256;
   swap(S[i],S[j]);
   t=(S[i]+S[j])mod 256;
   k[r]=S[t];//K爲密鑰

利用密鑰流與明文進行按位異或。

3.實驗總結

通過本次實驗,瞭解了鍵盤編碼的過程和方式,熟悉了curses 終端gui編程,掌握了openssl庫進行經常使用的加解密算法,同時也強化了樹莓派的使用。

4.遇到的問題

    1. curses不支持中文
      字符集的設置,源代碼中要#include <locale.h>,同時在main函數中setlocale(LC_ALL,"");
      編譯時要選擇寬字符集版本gcc -o hello hello.c –lncursesw 而不是gcc -o hello hello.c –lcurses(能夠經過apt-get install libncursesw5安裝)
    2. curses庫裏的鍵盤編碼是curses自定義的一套編碼,與虛擬鍵碼有區別。一開始混淆了這個。
    3. curses菜單編程比較生疏,二級菜單沒有實現,也沒有實現標題欄式的菜單。
相關文章
相關標籤/搜索