全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:4957
推到 Plurk!
推到 Facebook!

編碼解碼的問題

答題得分者是:brook
leecola
一般會員


發表:1
回覆:3
積分:0
註冊:2008-01-23

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-01-23 17:47:28 IP:163.32.xxx.xxx 訂閱
我有一個金鑰密文如下

MIICoTAbBgkqhkiG9w0BBQMwDgQIZJz8gHbMXnMCAggABIICgP jSLWdOhS9n5gm
C7MkS2VqoNE9f5fR88VFF/XJ5wKdgiHmDJqGh O81CNSiY9HNJS9hXGSPsvO7 l
V8f4E59k1OyLSO8V8qg7elE/ugvMGBer114pxcxBJWsKT1QTfZJDRZgD3ErV77gb
wZ0tewF7z/l MUCMpKi/IJ2WIm71yOQ9AOTEgOBwsCdjdJOGOedVaf1orJb7Pg1S
bixVXy1Gq0uEn/HJAL1Wc20YcjnnDl6lQpX74ax5kG8o/txuDyk/Rp47TS4Vi//V
Oks7e6eThKhJkOdD0cOpn0EVrcStcrr5rWW9GDULupDxjj4xN8QhqnXk8QkynMXZ
Utuw0oPL2faH9m3IHb/JbUQwtR9b0LeJuNcccMq58UW67oxcYkLn74R7/SaNR180
BwlvSJnkIG7b6yXFw51YgprxyfMXWieGLf/0RBl1sMrpnMZn4gCMsYUzgiSEdkeg
ZEdT2qdbBH1yI2YjpU9UyT19oZ9g1WzDqsN1CzdO8BSpAXLy6AwTMACSYg/rIZ3B
W4oMq1W6Bh8iI3SZTwP4xwqojg2qU8w1YrzcK3J03HzUdYebp4bYpaY/n6nF2vum
8/4aps8SBNmCoDM90B6XPDEyqy7oQyTH5QyX88YNNRnIbkXhHqFty7yy4S/0fX8I
PomdeH87bv7tVPFqBKQWAp4dwjq5W3plv8NSEGcc6ldblLjco7heObsbgfcBaTvc
3hTecOp6QGvvdu6MR55jNfBRRA4dH0eiof/mMIsKtMbiActZOnMwGvdJ0FrmG9aY
/hkcp975nQv6AO4VLZBDketV3j0OCz reJ6zJFy9X5fEnAH7PubfmB rEuOVo6qT
WgwXw28=
因為研究需要,將以上字串以 base64 decode 之後會得到 binary 然後再以 Hex 型態編碼存放。
得到 Hex 字串長度 1440 bite 如下
308202A1301B06092A864886F70D010503300E0408649CFC8076CC5E730202080004820280FFA348B59D3A14BD9F98260BB3244B656AA0D13D7F97D1F3C54517F5C9E7029D8221E60C9A8687E3BCD42352898F473494BD8571923ECBCEEFEFA557C7F8139F64D4EC8B48EF15F2A83B7A513FBA0BCC1817ABD75E29C5CC41256B0A4F54137D9243459803DC4AD5EFB81BC19D2D7B017BCFF97E31408CA4A8BF209D96226EF5C8E43D00E4C480E070B0276374938639E75569FD68AC96FB3E0D526E2C555F2D46AB4B849FF1C900BD56736D187239E70E5EA54295FBE1AC79906F28FEDC6E0F293F469E3B4D2E158BFFD53A4B3B7BA79384A84990E743D1C3A99F4115ADC4AD72BAF9AD65BD18350BBA90F18E3E3137C421AA75E4F109329CC5D952DBB0D283CBD9F687F66DC81DBFC96D4430B51F5BD0B789B8D71C70CAB9F145BAEE8C5C6242E7EF847BFD268D475F3407096F4899E4206EDBEB25C5C39D58829AF1C9F3175A27862DFFF4441975B0CAE99CC667E2008CB185338224847647A0644753DAA75B047D72236623A54F54C93D7DA19F60D56CC3AAC3750B374EF014A90172F2E80C13300092620FEB219DC15B8A0CAB55BA061F222374994F03F8C70AA88E0DAA53CC3562BCDC2B7274DC7CD475879BA786D8A5A63F9FA9C5DAFBA6F3FE1AA6CF1204D982A0333DD01E973C3132AB2EE84324C7E50C97F3C60D3519C86E45E11EA16DCBBCB2E12FF47D7F083E899D787F3B6EFEED54F16A04A416029E1DC23AB95B7A65BFC35210671CEA575B94B8DCA3B85E39BB1B81F701693BDCDE14DE70EA7A406BEF76EE8C479E6335F051440E1D1F47A2A1FFE6308B0AB4C6E201CB593A73301AF749D05AE61BD698FE191CA7DEF99D0BFA00EE152D904391EB55DE3D0E0B3FAB789EB3245CBD5F97C49C01FB3EE6DF981FAB12E395A3AA935A0C17C36F0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
我的問題是:現在需要將其反轉再解回 base64 編碼
可是都執行到
MIICoTAbBgkqhkiG9w0BBQMwDgQIZJz8gHbMXnMCAgg=
就沒了,不知道為什麼呢?有沒有人知道應該怎麼寫?
我失敗的作法(參考)如下

[code cpp]
unsigned int k=120;
char read['k'];
char buf2['k'];
AnsiString buf2add,encod64;
FILE *fp;
fp = fopen("key-hex","r");
for (unsigned int j=0;j<=1440/k;j )
{
fgets(read,k,fp);
HexToBin(read,buf2,k);
buf2add =buf2;
}
encod64 = IdEncoderMIME1->Encode(buf2add);
fclose(fp);
redtResult->Lines->Add(encod64);
[/code]
編輯記錄
leecola 重新編輯於 2008-01-23 18:05:08, 註解 無‧
leecola 重新編輯於 2008-01-23 18:10:03, 註解 無‧
leecola 重新編輯於 2008-01-23 18:22:26, 註解 無‧
taishyang 重新編輯於 2008-01-23 20:02:11, 註解 無‧
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-01-23 21:22:36 IP:61.222.xxx.xxx 訂閱
根據我多年的經驗,不對不要用磚頭砸我。
這個問題跟編碼與解碼無關。

應該是 Char 轉換為 AnsiString 因字串中有 #0 字元關係導致後面的字元沒有複製過來。
leecola
一般會員


發表:1
回覆:3
積分:0
註冊:2008-01-23

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-01-25 15:10:40 IP:163.32.xxx.xxx 訂閱
先謝謝 RootKit 的回答
我也發現確實有某些字元有問題,但就是不知哪些(bin)字元有問題。
我用了以下的語法,仍無法得到正確答案,不知是否用法錯誤
[code cpp]
char* replace=buf2;
{
char *p =replace;
if(*p=='#0')
*p='\0';
}
[/code]

總之我的目的就是要
base64 → Binary → Hex ;
Hex → Binary → base64
現在出問題的是 Hex → Binary → base64 希望有經驗的人可以指導一下!
編輯記錄
leecola 重新編輯於 2008-01-25 15:51:19, 註解 無‧
leecola 重新編輯於 2008-01-25 15:54:22, 註解 無‧
leecola 重新編輯於 2008-01-25 18:38:23, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-01-25 18:12:19 IP:61.64.xxx.xxx 訂閱
密碼學的處理,本來就不適合使用 String 型別來處理

請用 Byte array

轉換用字串,必死

字串是傳輸過程用的一種方式而已

===================引 用 leecola 文 章===================
先謝謝RootKit的回應
我也發現確實有某些字元有問題。那請問 BCB6 在 char* 有沒有像 StringReplace 找出特殊字並轉換的
例如
[code cpp]
StringReplace(buf2add ,"\n", "\0", TReplaceFlags() << rfReplaceAll<
[/code]
上面這是用在String 的,那有沒有用於 char* 的呢(因為 char* 轉 String 有問題呀,所以先在 char* 過濾處理)

總之我的目的就是要
base64 → Binary → Hex ;Hex → Binary → base64
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-01-26 08:09:39 IP:219.80.xxx.xxx 訂閱
1.先確認是
base64 → Binary
Binary → base64
的問題還是
Binary → Hex
Hex → Binary
的問題,先把問題簡單化.
2.不要用fgets,因為換行字元可能會不見,檔案一次讀完.
RootKit
資深會員


發表:16
回覆:358
積分:419
註冊:2008-01-02

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-01-27 04:20:03 IP:61.222.xxx.xxx 訂閱
原因我已經說明很清除了。
因該就是這裡出問題
buf2add =buf2;

因此在buf2 拷貝至 Buf2Add 時就會因#0誤為截斷。
但 Buf2 內容是對的,需要做一次轉換或者直接將 Buf2Add改為 Char*。
一般是用 SetString(S,Buf2,K);


leecola
一般會員


發表:1
回覆:3
積分:0
註冊:2008-01-23

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-01-29 23:23:09 IP:59.127.xxx.xxx 訂閱
先感謝RootKit 、syntax、brook、的指導,
首先,我用F5讓程式中斷時,在
HexToBin(read,buf2,k);
發現buf2與read的長度有明顯不同。所以我初步判斷是base64 → Binary、Binary → base64這邊有問題,
再來使用BYTE的方法(需要改很多地方),一直沒有試出來
像HexToBin需要使用 char 如要改BYTE就要用其他的方法來轉了,IdEncoderMIME1->Encode 也是
最後
SetString(S,Buf2,K);
回報"E2268 Call to undefined function 'SetString'"
不知是我的環境問題還是使用方法不對,我是用

[code cpp]
AnsiString S;
SetString(S,buf2,k);
buf2add = S;
[/code]

以上BYTE的方法、SetString的方法,花了我兩天的時間,一直沒有做成功。
目前還在繼續努力中!
brook
資深會員


發表:57
回覆:323
積分:371
註冊:2002-07-12

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-01-30 09:12:59 IP:219.80.xxx.xxx 訂閱

[code cpp]
void __fastcall TForm1::Button1Click(TObject *Sender)
{
AnsiString ss;
TMemoryStream *pms = new TMemoryStream();

RichEdit1->Lines->LoadFromFile("D:\\1.txt");
RichEdit1->Lines->SaveToStream(pms);
pms->Position = 0;
ss = IdEncoderMIME1->Encode(pms,(pms->Size 2)/3*3);
RichEdit2->Lines->Clear();
RichEdit2->Text = ss;

IdDecoderMIME1->DecodeToStream(ss,pms);
pms->Position = 0;
RichEdit3->Lines->LoadFromStream(pms);;
delete pms;
}
[/code]
1.參考 http://delphi.ktop.com.tw/board.php?cid=168&fid=923&tid=47345
2. HexToBin 似乎不是bcb的指令,假如轉後有可能會有0x00的情況,不可使用 AnsiString,
因此在buf2 拷貝至 Buf2Add 時就會因#0誤為截斷。不是誤判,而是常識.
3.我的IdEncoderMIME1->Encode參數不能只帶入AnsiString,只能用另一個方式,而數目又要是3的倍數才會用(pms->Size 2)/3*3.
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-01-30 09:33:25 IP:61.64.xxx.xxx 訂閱
看來你還是沒有聽清楚

不要用 String!也不要作 String的思考方式
用 Char S[90] 之類的方式,同一時間可以看成 String 也其實就是 Byte array
另外
{
因為研究需要,將以上字串以 base64 decode 之後會得到 binary 然後再以 Hex 型態編碼存放。
得到 Hex 字串長度 1440 bite 如下
308202A1301B06092A864886F70D010503300E0408649CFC8076CC5E73020208000482
}

在我看來,該行不是 Hex 編碼
你自己去看 M 的 ASCII 是多少?是 30 嗎?

30 82 02 A1 30 1B 06 09 2A 86 48 86 F7 0D 01 05 03 30 0E 04 08 64 9C FC 80 76 CC 5E 73 02 02 08 00 04 82...
在我看來,到像是(這是什麼格式呢?)
30 82 02 A1
----30 1B
---------06 09 2A 86 48 86 F7 0D 01 05 03 30 0E 04 08 64 9C FC 80 76 CC 5E 73 02 02 08 00 04 82...

另外在請你去搞清楚「得到 Hex 字串長度 1440 bite」
到底是 Binary 然後你在編譯器或是 Hex 編輯器內,看到 308202A1301B0 ...
還是在筆記本內看到 308202A1301B0 ..
.
我想你對於加解密的系統相關知識,不夠喔!你 paper 或 standard 沒看熟喔!

可以提示你運作過程是 Base64 --> xxx 與 xxx --> Base64 ,但 xxx 不是 Hex,xxx 是 Binary 但不看成 Binary

===================引 用 leecola 文 章===================
先感謝RootKit 、syntax、brook、的指導,
首先,我用F5讓程式中斷時,在
HexToBin(read,buf2,k);
發現buf2與read的長度有明顯不同。所以我初步判斷是base64 → Binary、Binary → base64這邊有問題,
再來使用BYTE的方法(需要改很多地方),一直沒有試出來
像HexToBin需要使用 char 如要改BYTE就要用其他的方法來轉了,IdEncoderMIME1->Encode 也是
最後
SetString(S,Buf2,K);
回報"E2268 Call to undefined function 'SetString'"
不知是我的環境問題還是使用方法不對,我是用

[code cpp]
AnsiString S;
SetString(S,buf2,k);
buf2add = S;
[/code]

以上BYTE的方法、SetString的方法,花了我兩天的時間,一直沒有做成功。
目前還在繼續努力中!
leecola
一般會員


發表:1
回覆:3
積分:0
註冊:2008-01-23

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-02-13 23:37:28 IP:59.127.xxx.xxx 訂閱
實在對不起大家,我發現好像是"\0"造成問題的。
請問在BCB6裡面如何將插有多個"\0"的char[]轉成String或AnsiString?

自問自答,
謝謝大家,我想我找到方法了!
[quote]
//一個字一個字轉
c =Encbuf[i];
[/quote]


上述
MIICoTAbBgkqhkiG‧‧‧‧‧‧‧‧‧‧是個經過base64轉換後的金鑰,其內容為binary型態的資料
所以經過 IdDecoderMIME1->DecodeToString 得到的是binary資料,我加以 BinToHex 轉換以方便存放。
在反解的時候,我碰到的問題是這個binary資料內有\0於是造成反解中斷,所以必須一個字一個字轉。
現在存入、取出都可以正確並得到驗證了。
再次謝謝大家!
編輯記錄
leecola 重新編輯於 2008-02-14 01:22:12, 註解 無‧
系統時間:2024-04-25 18:35:17
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!