CryptoSharp: Step 1

C#入門實(shí)踐:Windows桌面加密器 CryptoSharp

Step 1 BASE64/編碼/DLL

by Pixel Frame

GitHub: CryptoSharp
源碼在文中基本不再出現(xiàn)。

0x00 前期準(zhǔn)備

本著由淺入深柬赐、由簡入繁、Top Down的原則菱属,首先為Visual Studio選擇一個(gè)好看的配色方案和合適的字體(什么狗P邏輯)。
個(gè)人還是比較喜歡深色配色舰罚,奈何Color Theme Editor插件中沒有Monokai配色纽门,自己改一個(gè)又太累了(),所以直接選擇了Dark with Light Editor营罢。
字體上的話赏陵,用Font Link把Consolas和微軟雅黑鏈接是一個(gè)簡單快捷的選擇。思源的等寬字體感覺太寬了饲漾,和中文混排看起來十分詭異蝙搔。原生的中英文混排等寬字體其實(shí)非常少,比如說新宋體()考传。首推的還是Belleve大的更紗黑體吃型,還有一個(gè)經(jīng)典選擇自然是文泉驛等寬微米黑和文泉驛等寬正黑

0x01 BASE64與編碼

作為一個(gè)加密器自然需要考慮各種各樣的編碼問題僚楞,雖然說也有很多場合把BASE64稱作加密勤晚,但其本質(zhì)只是把不可顯示的ASCII碼轉(zhuǎn)換到了可顯示部分。C#的Convert類中自帶了BASE64轉(zhuǎn)換泉褐,所以可以直接調(diào)用(本篇完赐写,下面沒有了)。

然而膜赃,要自己實(shí)現(xiàn)一遍~(我寫的比庫函數(shù)好得多.png)血淌。

C#所有文本都是Unicode(UTF-16LE),即對(duì)應(yīng)C++中的16位字符wchar_t财剖,不能和C++一樣將工程設(shè)置為多字節(jié)(UTF-8/ANSI等)。這對(duì)于進(jìn)行加解密操作其實(shí)是不太方便的癌淮,BASE64是針對(duì)8位的byte(unsigned char)進(jìn)行操作的躺坟,因此我們需要自己構(gòu)建一個(gè)C++的std::string來方便操作。當(dāng)然乳蓄,加密算法中大量bit級(jí)的操作其實(shí)都不適合軟件編程咪橙,相比之下用HDL作專用硬件會(huì)方便很多。關(guān)于位操作的問題會(huì)在DES中更多涉及。

ByteString

一個(gè)好用的string類需要哪些東西是很顯然的美侦,動(dòng)態(tài)分配/截取/查找/運(yùn)算符重載...當(dāng)然产舞,我的目標(biāo)是夠用就行,需要新的功能時(shí)再行添加菠剩。C#的List<>和數(shù)組十分強(qiáng)大易猫,可以直接通過AddRange(), ToArray(), ToList()等一系列方法進(jìn)行轉(zhuǎn)換和增加,因此其實(shí)就是對(duì)List<byte>做一個(gè)二次封裝具壮。
List<byte>保存字符數(shù)據(jù)准颓,重載+運(yùn)算符,構(gòu)造函數(shù)棺妓,定義索引器[]攘已,外加Set/GetBytes()ToString()方法。這樣一個(gè)簡單可用的ByteString類就完成了怜跑。
在之后可能還會(huì)加入移位等的功能样勃,在遇到時(shí)再行討論。

BASE64

BASE64的加解密并不復(fù)雜性芬,簡單來說就是每三個(gè)bytes進(jìn)行一次替換峡眶,不足的地方用=替換。那么批旺,這里就直接從一份C++代碼進(jìn)行改寫幌陕。將C++中的char全部改為byte類型,通過Encoding獲取字符的ASCII碼汽煮,這里只要采用多字節(jié)代碼頁(ANSI/UTF-8/GBK/BIG5)都是沒有問題的搏熄,結(jié)果都是相同的ASCII碼。當(dāng)然Encoding會(huì)損失一定的性能暇赤,通過硬編碼將對(duì)應(yīng)ASCII碼寫入程序能提高一定的性能心例,當(dāng)然既然選擇了C#對(duì)性能也不做過分的追求了。
一般而言會(huì)將查找表設(shè)為全局常量鞋囊,然而并沒有找到如何聲明一個(gè)const數(shù)組止后,那么就只好使用static readonly,效果似乎是相同的溜腐。

static readonly byte[]  base64Table = Encoding.UTF8.GetBytes("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 +/");
static readonly byte    base64Pad = Encoding.UTF8.GetBytes("=")[0];
static readonly byte[]  base64PadD = Encoding.UTF8.GetBytes("==");
static readonly int[]   decodeTable =
    {
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -1, -1, -2, -2, -1, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -1, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, 62, -2, -2, -2, 63,
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -2, -2, -2, -2, -2, -2,
    -2,  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, -2, -2, -2, -2, -2,
    -2, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2,
    -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2, -2
    };

加解密過程就不作詳細(xì)解釋了译株,再來說說編碼的問題⊥σ妫基本的加密方法的輸入是byte[]輸出是string(UTF-16LE)歉糜,但一般而言輸入會(huì)是一個(gè)字符串并且會(huì)有各種編碼的可能(當(dāng)然作為C#程序一般獲取到的都會(huì)是UTF-16LE)。高級(jí)語言的好處就在于各種功能都有現(xiàn)成的封裝望众,相比C++的MultiByteToWideChar()函數(shù)和USES_CONVERSION宏匪补,C#的Encoding類要方便很多伞辛,支持的編碼可以在微軟的開發(fā)文檔中找到。核心的EncryptDecrypt方法使用byte[]作為輸入/輸出夯缺,再進(jìn)行string的重載并且添加指定編碼參數(shù)蚤氏。

public static String Encrypt(byte[] bPlain);

public static String Encrypt(String strPlain, String coding);

public static String Encrypt(String strPlain, int coding);

public static byte[] Decode(String strEnc);

public static String DecodeEncoding(String strEnc, String coding);

public static String DecodeEncoding(String strEnc, int coding);

0x02 解決方案與DLL

為了方便管理,將各個(gè)加密算法作為DLL項(xiàng)目添加至解決方案中踊兜。DLL的接口方法會(huì)逐漸完善竿滨。最終CryptoSharp將只需要調(diào)用DLL的接口,本身則是WinForm UI為主润文。
C#中同一解決方案項(xiàng)目姐呐、.NET庫、外部DLL都只需要在添加引用即可典蝌,包括C++ COM組件DLL也是可以直接使用的曙砂。


次回予告:DES AND SHIFTING


END_OF_PART_2

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市骏掀,隨后出現(xiàn)的幾起案子鸠澈,更是在濱河造成了極大的恐慌,老刑警劉巖截驮,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笑陈,死亡現(xiàn)場離奇詭異,居然都是意外死亡葵袭,警方通過查閱死者的電腦和手機(jī)涵妥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來坡锡,“玉大人蓬网,你說我怎么就攤上這事○睦眨” “怎么了帆锋?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長禽额。 經(jīng)常有香客問我锯厢,道長,這世上最難降的妖魔是什么脯倒? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任实辑,我火速辦了婚禮,結(jié)果婚禮上藻丢,老公的妹妹穿的比我還像新娘徙菠。我一直安慰自己,他們只是感情好郁岩,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布婿奔。 她就那樣靜靜地躺著,像睡著了一般问慎。 火紅的嫁衣襯著肌膚如雪萍摊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天如叼,我揣著相機(jī)與錄音冰木,去河邊找鬼。 笑死笼恰,一個(gè)胖子當(dāng)著我的面吹牛踊沸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播社证,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼逼龟,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了追葡?” 一聲冷哼從身側(cè)響起腺律,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎宜肉,沒想到半個(gè)月后匀钧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谬返,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年之斯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片遣铝。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡佑刷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翰蠢,到底是詐尸還是另有隱情项乒,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布梁沧,位于F島的核電站檀何,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏廷支。R本人自食惡果不足惜频鉴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望恋拍。 院中可真熱鬧垛孔,春花似錦、人聲如沸施敢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至概作,卻和暖如春腋妙,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背讯榕。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工骤素, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人愚屁。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓济竹,卻偏偏與公主長得像,于是被迫代替她去往敵國和親霎槐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子送浊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)栽燕,斷路器罕袋,智...
    卡卡羅2017閱讀 134,716評(píng)論 18 139
  • 概述 之前一直對(duì)加密相關(guān)的算法知之甚少,只知道類似DES碍岔、RSA等加密算法能對(duì)數(shù)據(jù)傳輸進(jìn)行加密浴讯,且各種加密算法各有...
    Henryzhu閱讀 3,024評(píng)論 0 14
  • 字符是用戶可以讀寫的最小單位榆纽。計(jì)算機(jī)所能支持的字符組成的集合,就叫做字符集捏肢。字符集通常以二維表的形式存在奈籽。二維表的...
    劉惜有閱讀 8,131評(píng)論 2 14
  • 深而有力的呼吸:左側(cè)腰部疼,無情緒 發(fā)泄與釋放: 1鸵赫,該做的不敢做衣屏,怕被說、被指責(zé)無用辩棒;?? 不做離開了道?? 做...
    元麗Sarah藍(lán)風(fēng)暴閱讀 416評(píng)論 0 1
  • 本周項(xiàng)目實(shí)施過程中暴露了很多問題一睁, 1. 自己這個(gè)不懂技術(shù)的PM钻弄,一定限制了項(xiàng)目的進(jìn)展花吟。這個(gè)開始我就提醒過老板我不...
    韋陀閱讀 166評(píng)論 0 0