[問題] 替代式加密算法之解碼

看板C_and_CPP (C/C++)作者 (卡卡獸)時間12年前 (2014/01/04 23:23), 編輯推噓7(7015)
留言22則, 9人參與, 最新討論串1/1
這問題我常遇到,只舉一個應用當引文例子,然後請別受限在只有 256 個元素, 因其它例子的情況資料量會更大。 問題是這樣的,我必須對字串加密,加密後還必須是可視字元 ( isprint(ch)==true ), 為了加快加密之速度,我建了份 table, c約如下。 typedef unsigned char byte; ///< 因會拿來當索引,所以宣告成 unsigned char byte enMapping[256] ; for(i = 0 ; i < 256 ; ++i) enMapping[i] = i; // ASCII 0x2E~0x7F 為可視字元,對這範圍做洗牌動作 shuffle(enMapping+0x2E, enMapping + (0x7F-0x2E+1) ); // 加密函式 void Encryption( byte * pszSrc , byte * pszEn , byte * enMapping) { while(*pszSrc) *pszEn++ = enMapping[*pszSrc++]; } 解密也是一樣用 mapping 的方式進行,所以要從 byte enMapping[256] 產生出 byte deMapping[256],目前的 Code 是直接調用 qsort , 這動作還蠻頻繁使用的, 但我覺得以這例子 "好像" 有比 qsort 還快之排序法,約如下面的方式。 void GenerateDeMapping(char * enMapping , char * deMapping) { int i, j; byte tmpMapping[256], tmp; // 備份,避免把 enmapping 洗亂 memcpy( (void*)tmpMapping , (const void*)enMapping , 256 ); for(i = 0 ; i < 256 ; ++i) deMapping[i] = i; for(j = 0x2E ; j <= 0x7F ; ++j){ // 交換到對的位置為止 while( (tmp = tmpMapping[j]) != j) { swap(tmpMapping[tmp], tmpMapping[j]) ; swap(deMapping[tmp], deMapping[j]) ; } } } 這裡就產生了解碼用的 mapping 了。再化簡一下問題, Q : 假設一個整數陣列裡面,每個數字都只出現過一次, 是否有較特殊之排序法能較快完成上述動作? 謝謝各位不吝賜教,感激不盡。 -- ~ 這輩子與神手無緣 我只好當神獸了 ~ 卡卡獸 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 180.177.74.188

01/04 23:26, , 1F
還有一個問題是, byte tmpMapping[256], tmp; 這兩個變數
01/04 23:26, 1F

01/04 23:26, , 2F
是不是加上 static 較佳?謝謝。
01/04 23:26, 2F

01/04 23:31, , 3F
for(i=0~255) deMap[ enMap[i] ] = i;
01/04 23:31, 3F

01/04 23:32, , 4F
= = 原來我把問題想複雜了, 謝謝樓上 .
01/04 23:32, 4F

01/04 23:33, , 5F
不要用 static,遇到 thread 會死
01/04 23:33, 5F

01/04 23:34, , 6F
然後如果要加密輸出可視字元,我會用 AES + Base64...
01/04 23:34, 6F

01/04 23:37, , 7F
謝謝 littleshan , 我還真不知道 AES + BASE64 可編成可視
01/04 23:37, 7F

01/04 23:42, , 8F
base64就是anything=>可視阿..XD
01/04 23:42, 8F

01/04 23:42, , 9F
真正說要加密是AES
01/04 23:42, 9F

01/04 23:45, , 10F
剛查了一下,真的可行,謝謝補充。
01/04 23:45, 10F

01/05 13:39, , 11F
不會吧,上過網沒用過base64也看過base64走路
01/05 13:39, 11F

01/05 14:41, , 12F
AEA加密後接baseXX, uuencode, QP encoding都可
01/05 14:41, 12F

01/05 16:49, , 13F
AES 加密後的東西拿去 QP 會不會有點太囧...
01/05 16:49, 13F

01/05 19:40, , 14F
樓上是覺得哪裡囧 穿防彈衣後外面穿地攤外套不搭是嗎
01/05 19:40, 14F

01/05 20:15, , 15F
是不到不搭啦, 只是純二進位資料不太會用 QP 就是
01/05 20:15, 15F

01/05 21:48, , 16F
用QP通常是為了保留readability 反正這用途用哪個都沒差
01/05 21:48, 16F

01/05 22:15, , 17F
如果要求編碼前後須維持相同長度, 那 AES+Base64 就不能用了.
01/05 22:15, 17F

01/05 22:16, , 18F
同理, 接baseXX, uuencode, QP encoding 也是一樣.
01/05 22:16, 18F

01/05 23:37, , 19F
3樓XD
01/05 23:37, 19F

01/05 23:37, , 20F
真是好方法
01/05 23:37, 20F

01/06 00:47, , 21F
@yvb, 維持長度那問題應該不大,多一份資訊紀錄 padding
01/06 00:47, 21F

01/06 00:47, , 22F
bytes 一起加密就沒問題了.
01/06 00:47, 22F
文章代碼(AID): #1Io2TOfL (C_and_CPP)
文章代碼(AID): #1Io2TOfL (C_and_CPP)