banner

[Rule] Rules  [Home] Main Forum  [Portal] Portal  
[Members] Member Listing  [Statistics] Statistics  [Search] Search  [Reading Room] Reading Room 
[Register] Register  
[Login] Loginhttp  | https  ]
 
Forum Index Thảo luận hệ điều hành Windows Xin giúp đỡ bài mã hóa dùng thuật toán Xor  XML
  [Programming]   Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 05:31:57 (+0700) | #1 | 143879
[Avatar]
bienxanhlunglinh
Member

[Minus]    0    [Plus]
Joined: 30/08/2005 07:23:16
Messages: 9
Offline
[Profile] [PM]
Các cao thủ vui lòng giúp em 1 bài mã hóa nhé. viết bằng Visual C++
Yêu cầu Mã hóa:
Nhập 1 chuỗi vào đối tượng Edit Textbox và click nút Mã hóa sẽ xuất ra chuỗi được mã hóa ở Edit Textbox thứ 2.
Nếu ta đem {Chuỗi nguồn} XOR với {chuỗi đã mã hóa} thì tìm được giá trị key, Trong đó key là 1 giá trị kiểu chuỗi cho trước, chẳng hạn họ tên mình

Ví dụ:
Dialog_1: Mã hóa: Nhập chuỗi cần mã hóa vào Edit Textbox_1, click Mã_hóa sẽ xuất ra trong Edit Textbox_2 đoạn chuỗi được mã hóa.
Edit Textbox_1 ==> Nhập AAA
Click Mã_hóa
Edit Textbox_2 ==> xuất HHH

Dialog_2 Giả mã (sẽ ngược với chu trình trên trong biến cố Command_giãi_mã)
Dialog_3 Tìm_Key: Key này là 1 giá trị kiểu chuỗi, cố định ví dụ như họ tên mình và được gán trước trong code chương trình
yêu cầu: nếu đem chuỗi cần mã hóa Xor với chuỗi đã được mã hóa thì tìm được key
Cụ thể là: chuổi nhập cần mã hóa [AAA] Xor [HHH] chuỗi đã được mã hóa sẽ tìm ra Key = [Tran_Van_A] đã được gán trước trong chương trình và key này là cố định.

Em làm nhưng không làm được, rất mong các cao thủ giúp em
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 05:36:01 (+0700) | #2 | 143883
[Avatar]
K4i
Moderator

Joined: 18/04/2006 09:32:13
Messages: 635
Location: Underground
Offline
[Profile] [PM]
Bạn có biết toán tử XOR trong C/C++ là gì không smilie
Sống là để không chết chứ không phải để trở thành anh hùng
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 19:52:37 (+0700) | #3 | 143979
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
- Cảnh cáo đồng chí bienxanhlunglinh spam tin nhắn cá nhân trên diễn đàn.
- HVA không phải là nơi giải bài tập dùm đồng chí. Đồng chí nên tìm hiểu, khúc mắc ở đoạn nào có thể thắc mắc để thảo luận.
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 21:06:04 (+0700) | #4 | 143989
[Avatar]
bienxanhlunglinh
Member

[Minus]    0    [Plus]
Joined: 30/08/2005 07:23:16
Messages: 9
Offline
[Profile] [PM]
Em chào các đại cao thủ, cứ tưởng các đại ca tận tình giúp đỡ chứ, đằng này lại bị cảnh cáo mới chán chứ.
Nói thẳng chút nhé, Dại ca K4i thì nói "Bạn có biết toán tử XOR trong C/C++ là gì không?" Vậy dại ca bóp đầu cái coi xem hiểu đc bao nhiêu C/C++ rồi ? ==>chán!
Bxll thì nghĩ cái Tin học thì có ai biết hết ? biết thôi cũng là quá cao siêu rồi. Bạn K4i hỏi nghe y như văn sĩ phòng thương mại của Microsoft thuyết trình ấy!

Sorry đã send PM cho Anh FaL, Anh trách thế cũng đúng, có điều cái gì khó người ta đã cố gắng nhưng không làm được tức là vượt qua sức họ hoặc vượt qua khả năng của họ mới phải đi nhờ. Khó mới đi nhờ chứ đã làm được rồi thì chẳng nhờ các đại ca làm gì, và có thế mới nói rằng "...xin nhờ các Đại Cao Thủ giúp đỡ..." chứ nếu ko phải thế thì sẽ nói rằng "...đố các anh em làm đượpc đấy..." 2 câu trên có khác nhau không Anh? Thêm nữa vì giữ phép tôn trọng và hy vọng vào giúp đở cái mà Bxll không làm nổi nên Bxll mới gởi PM cho Anh và vì đã đọc bào viết của anh trên điễn đàn nên mới hy vọng nhiều vào anh như thế. Anh thử nghĩ xem - nếu Anh là Bxll? Anh sẽ giúp Bxll chứ?




[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 22:08:55 (+0700) | #5 | 143999
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

bienxanhlunglinh wrote:
Em chào các đại cao thủ, cứ tưởng các đại ca tận tình giúp đỡ chứ, đằng này lại bị cảnh cáo mới chán chứ.
Nói thẳng chút nhé, Dại ca K4i thì nói "Bạn có biết toán tử XOR trong C/C++ là gì không?" Vậy dại ca bóp đầu cái coi xem hiểu đc bao nhiêu C/C++ rồi ? ==>chán!
Bxll thì nghĩ cái Tin học thì có ai biết hết ? biết thôi cũng là quá cao siêu rồi. Bạn K4i hỏi nghe y như văn sĩ phòng thương mại của Microsoft thuyết trình ấy! 


K4i trả lời như thế là có ý của K4i. Bởi hiểu rõ XOR thì chẳng có gì mà phải đi hỏi bài tập loại này cả. Còn vụ "bóp đầu" thì bồ nên phát biểu cẩn thận, bài này chưa đủ để K4i "bóp đầu" đâu.

bienxanhlunglinh wrote:

Sorry đã send PM cho Anh FaL, Anh trách thế cũng đúng, có điều cái gì khó người ta đã cố gắng nhưng không làm được tức là vượt qua sức họ hoặc vượt qua khả năng của họ mới phải đi nhờ. Khó mới đi nhờ chứ đã làm được rồi thì chẳng nhờ các đại ca làm gì, và có thế mới nói rằng "...xin nhờ các Đại Cao Thủ giúp đỡ..." chứ nếu ko phải thế thì sẽ nói rằng "...đố các anh em làm đượpc đấy..." 2 câu trên có khác nhau không Anh? Thêm nữa vì giữ phép tôn trọng và hy vọng vào giúp đở cái mà Bxll không làm nổi nên Bxll mới gởi PM cho Anh và vì đã đọc bào viết của anh trên điễn đàn nên mới hy vọng nhiều vào anh như thế. Anh thử nghĩ xem - nếu Anh là Bxll? Anh sẽ giúp Bxll chứ?
 


- HVA không khuyến khích trao đổi kỹ thuật qua PM, mọi thắc mắc, thảo luận nên post lên diễn đàn để mọi người có thể tham khảo.

- Với câu hỏi của bồ thì phải reply kiểu gì đây? Nếu là cho bồ nguyên lời giải thì không bao giờ tôi làm chuyện đó. Bồ gặp khó khăn chỗ nào mọi người sẽ giúp, chứ giải luôn bài tập thì e hơi vô lý. 3 cái "dialog" đó bồ làm được cái nào rồi? chỗ nào chưa làm được, vì sao? Trình bày rõ ràng cụ thể sẽ tốt hơn.

Thân mến.

PS: không cần dùng từ "Đại cao thủ" ở đây.
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 29/07/2008 23:16:07 (+0700) | #6 | 144017
[Avatar]
bienxanhlunglinh
Member

[Minus]    0    [Plus]
Joined: 30/08/2005 07:23:16
Messages: 9
Offline
[Profile] [PM]
Thanks Anh FaL nhé, Bxll ko muốn care nhiều đến cách thảo luận như K4I thể hiện (dù K4I là bất kỳ ai và như thế nào) trong 1 thảo luận về kiến thức, bỏ cái này qua bên đi Anh, Bxll cỏ vẻ như đã được 2 Dialog Mã hóa và giãi mã chuỗi nhập vào bằng Xor, Cái giải mã cái chuỗi A nhập vào thì ngược lại so với khi Mã hóa.

Nhưng cái Dialog Tim key thì chịu. (Key là 1 giá trị được cố định trước trong chương trình ==> ko thay đổi được, trong khi giá trị plaintext nhập vào sẽ khác nhau mỗi lần nhập ==> giá trị sau khi mã hóa cũng sẽ thay đỗi), cụ thể:
Key_C="xin chao" //được gán trước, cố định trong code

Plaintext_A: nhập chuổi muốn mã hóa
Enziptext_B: chuỗi đã được mã hóa từ chuỗi A
theo yêu cầu đem chuỗi A ^ chuỗi B sẽ tìm ra chuỗi Key_C nhưng không cho phép nếu A Xor B ==' ' Msgbxo (" ");
vì các giá trị A và B luôn thay đổi theo mỗi lần nhập nên nếu Key_C đứng độc lập thì sao tìm (ko logic trong cấu trúc?) Vậy khi IDD_ma_Hoa phải kết hợp chuỗi nhập vào A kết hợp với Key đã cho để có chuỗi được mã hóa B, sau đó khi tiến hành Xor A với B thì mới có cơ sở tìm ra được Key_C chứ phải không Anh?
Nói chung cái đoạn tìm key là bxll không làm được, và giả thiết thêm nữa là nếu Key_C (cố định được gán trước) mà ta không biế`t là gì thì sao?

Thanks anh và mong nhận được hỗ trợ trong diễn đàn nhé.
[Up] [Print Copy]
  [Question]   Xin giúp đỡ bài mã hóa dùng thuật toán Xor 30/07/2008 03:48:37 (+0700) | #7 | 144055
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]

bienxanhlunglinh wrote:
theo yêu cầu đem chuỗi A ^ chuỗi B sẽ tìm ra chuỗi Key_C nhưng không cho phép nếu A Xor B ==' ' Msgbxo (" ");
vì các giá trị A và B luôn thay đổi theo mỗi lần nhập nên nếu Key_C đứng độc lập thì sao tìm (ko logic trong cấu trúc?) Vậy khi IDD_ma_Hoa phải kết hợp chuỗi nhập vào A kết hợp với Key đã cho để có chuỗi được mã hóa B, sau đó khi tiến hành Xor A với B thì mới có cơ sở tìm ra được Key_C chứ phải không Anh?
Nói chung cái đoạn tìm key là bxll không làm được, và giả thiết thêm nữa là nếu Key_C (cố định được gán trước) mà ta không biế`t là gì thì sao?  


Tui đọc mà không hiểu gì hết luôn. Yêu cầu của bồ đã có gợi ý rồi đó thôi.

bienxanhlunglinh wrote:

Dialog_3 Tìm_Key: Key này là 1 giá trị kiểu chuỗi, cố định ví dụ như họ tên mình và được gán trước trong code chương trình
yêu cầu: nếu đem chuỗi cần mã hóa Xor với chuỗi đã được mã hóa thì tìm được key
Cụ thể là: chuổi nhập cần mã hóa [AAA] Xor [HHH] chuỗi đã được mã hóa sẽ tìm ra Key = [Tran_Van_A] đã được gán trước trong chương trình và key này là cố định.

Em làm nhưng không làm được, rất mong các cao thủ giúp em
 


Có link này bồ đọc thêm xem sao:
http://www.tech-faq.com/xor-encryption.shtml
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 30/07/2008 04:06:01 (+0700) | #8 | 144057
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

bienxanhlunglinh wrote:

Nhưng cái Dialog Tim key thì chịu. (Key là 1 giá trị được cố định trước trong chương trình ==> ko thay đổi được, trong khi giá trị plaintext nhập vào sẽ khác nhau mỗi lần nhập ==> giá trị sau khi mã hóa cũng sẽ thay đỗi), cụ thể:
Key_C="xin chao" //được gán trước, cố định trong code

Plaintext_A: nhập chuổi muốn mã hóa
Enziptext_B: chuỗi đã được mã hóa từ chuỗi A
theo yêu cầu đem chuỗi A ^ chuỗi B sẽ tìm ra chuỗi Key_C nhưng không cho phép nếu A Xor B ==' ' Msgbxo (" ");
vì các giá trị A và B luôn thay đổi theo mỗi lần nhập nên nếu Key_C đứng độc lập thì sao tìm (ko logic trong cấu trúc?) 


Tóm lại có phải vấn đề bác thắc mắc là

key đã biết rồi thì sao còn phải tìm key?!!

phải không?
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 30/07/2008 04:51:50 (+0700) | #9 | 144068
[Avatar]
Tal
Member

[Minus]    0    [Plus]
Joined: 15/09/2007 16:50:17
Messages: 67
Offline
[Profile] [PM]
Theo mình hiểu thì yêu cầu của chương trinh thế này:

Bạn có 1 key = "helloworld" cố định chẳng hạn
Bạn nhập vào chuỗi A
Output là chuỗi B

Vậy B = A ^ key

Về phía người dùng, người ta không hề biết giá trị của key. Tuy vậy do bản chất của phép toán XOR ta có thể biết key bằng cách lấy A^B (Với mọi A, B miễn là B là kết quả mã hoá của A). Do đó người dùng sẽ lấy được key nếu có A và B.

Vậy vấn đề ở đây là nếu ta sử dụng key như thế nào (nếu key là 1 chuỗi). Ví dụ:
- lấy từng ký tự của A và xor với lần lượt từng ký tự của key
- lấy 2 ký tự của A và xor với 2 ký tự của key
....

Vậy chắc bạn gặp khó khăn ở phần này hả?

Còn theo mình nghĩ miễn là B là kết quả của A thì A^B luôn ra key (tất nhiên là phải đúng thuật toán)
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 01:22:57 (+0700) | #10 | 144257
[Avatar]
bienxanhlunglinh
Member

[Minus]    0    [Plus]
Joined: 30/08/2005 07:23:16
Messages: 9
Offline
[Profile] [PM]
Bxll xin cám ơn sự nhiệt tình của tất cả các Anh nhé,
To Anh FaL: Cám ơn Anh nhiều nhiều về cái link tech-faq nhé, rất tuyệt! từ đây đi sang cái link http://www.programmer2programmer.net/tips/encryption_decryption/Default.aspx
hay lắm, hy vọng em mần thêm được chút gì đó, ko hiểi lại hỏi các Anh.
Em tóm tắt lại chút yêu cầu để anh rõ hơn:
Dùng phép Xor để thực hiện mã hóa và tìm key, trong đó: Text_A: chuỗi nguồn được nhập vào từ bàn phím, đem mã hóa chuỗi Text_A này có được chuỗi mã hóa Text_B. Nếu ta đem [Text_A] XOR [Text_B] thì tìm được Key_C (Key_C là giá trị cho trước trong chương trình, Vd: char Key_C="Khoa_Ma" )

To Anh Tal : Yêu cầu đúng như ANh nói.
/*=================>
Bạn có 1 key = "helloworld" cố định chẳng hạn
Bạn nhập vào chuỗi A
Output là chuỗi B
Vậy B = A ^ key
Về phía người dùng, người ta không hề biết giá trị của key. Tuy vậy do bản chất của phép toán XOR ta có thể biết key bằng cách lấy A^B (Với mọi A, B miễn là B là kết quả mã hoá của A). Do đó người dùng sẽ lấy được key nếu có A và B. Vậy vấn đề ở đây là nếu ta sử dụng key như thế nào (nếu key là 1 chuỗi). Ví dụ:
- lấy từng ký tự của A và xor với lần lượt từng ký tự của key
- lấy 2 ký tự của A và xor với 2 ký tự của key
....
Vậy chắc bạn gặp khó khăn ở phần này hả?
Còn theo mình nghĩ miễn là B là kết quả của A thì A^B luôn ra key (tất nhiên là phải đúng thuật toán)
===================>*/

Anh giúp em tiếp đi. Em chỉ làm được Dialog1: Mã hóa chuỗi A nhập vào được chuỗi mã hóa B, Dialog2: Giải mã ngược lại. Em không làm được khi phối hợp mã hóa Chuỗi A + giá trị của Key_C để có được chuỗ Mã hóa B, từ đó ta Lấy Chuỗi A Xor với B thì sẽ tìm ra được Key_C đã gán trước trong code chương trình ?

EM hỏi thêm (Mở rộng): Nếu sau khi hoàn tất được yêu cầu trên (mã hóa: A + Key = B, vậy Kết hợp A ^ B ==>Key_C ) thì có thể mở rộng thêm chút là :
Coi như mình là người dùng, không biết giá trị Key_C, thể gán lặp for cho 2 biến i và j cho 2 thằng này chạy mụch đích của là sẽ đi tìm từng giá trị của Key? theo phương pháp Key_gen. Có được không các Anh?







[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 01:50:32 (+0700) | #11 | 144263
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

bienxanhlunglinh wrote:

Em chỉ làm được Dialog1: Mã hóa chuỗi A nhập vào được chuỗi mã hóa B, Dialog2: Giải mã ngược lại. Em không làm được khi phối hợp mã hóa Chuỗi A + giá trị của Key_C để có được chuỗ Mã hóa B, từ đó ta Lấy Chuỗi A Xor với B thì sẽ tìm ra được Key_C đã gán trước trong code chương trình ?
 

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.

EM hỏi thêm (Mở rộng): Nếu sau khi hoàn tất được yêu cầu trên (mã hóa: A + Key = B, vậy Kết hợp A ^ B ==>Key_C ) thì có thể mở rộng thêm chút là :
Coi như mình là người dùng, không biết giá trị Key_C, thể gán lặp for cho 2 biến i và j cho 2 thằng này chạy mụch đích của là sẽ đi tìm từng giá trị của Key? theo phương pháp Key_gen. Có được không các Anh?
 

Tui nghĩ là không khả thi, có rất nhiều cái key_C mà bạn dùng như vậy cũng giống như là Brute force.
Cái đó chỉ là 1 vấn đề, còn 1 vấn đề nữa là mình chưa biết người ta mã hóa theo kiểu nào, cho dù có thử đúng key mà mình giải mã theo cách khác cũng vậy.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 04:08:46 (+0700) | #12 | 144296
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:
Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao. 


Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.

@bienxanhlunglinh: tui nghĩ Dialog1 và Dialog2 phải được thiết kế để không cho phép gõ vào các plaintext và ciphertext dài hơn key; còn Dialog3 thì tiếp nhận chuỗi A và chuỗi B bất kỳ rồi tính Key = A ^ B và hiện Key. Giá trị Key này không liên quan đến key cố định ở trong mã nguồn của chương trình.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 05:53:08 (+0700) | #13 | 144330
[Avatar]
Tal
Member

[Minus]    0    [Plus]
Joined: 15/09/2007 16:50:17
Messages: 67
Offline
[Profile] [PM]
Giả sử
- Input String là: A
- Output String là: B

Mã hóa dùng phép toán xor, ta có thể tính toán độ dài của chuỗi con nhập vào để xor với key. Ví dụ:
- Chọn từng ký tự một của A để mã hóa (độ dài chuỗi con là 1)
- Chọn hai ký tự một của A để mã hóa (độ dài chuỗi con là 2)
....

Trong trường hợp này, chuỗi con phải có độ dài bằng độ dài của key. Chuỗi cha nếu như có độ dài không chia hết cho độ dài key, ta phải thêm phần padding (để độ dài A là bội của key)

Ta nhận thấy là dù key thế nào thì chuỗi A và B phải có độ dài bằng nhau. Nhận xét nữa là thứ tự chuỗi con của A và B là giống nhau.

Vậy thì ta sẽ chọn các chuỗi con tương ứng của A, B để xor với nhau -> key.

(Chú ý nữa là nếu key đúng thì khi xor đến lần thứ 2, ta sẽ nhận được key giống key của lần xor thứ 1, còn nếu key sai -> chuỗi con ta chọn là sai. Loại bỏ vòng lặp)

Ví dụ:
A = 0000
B = 1111
(key=1)
chuỗi con =1 -> key = 1

A = 1101
B = 0111
(key=10)
chuỗi con = 1 -> key1 = 1, key2 = 0 -> chuỗi con độ dài 1 là sai. Tăng giá trị chuỗi con
chuỗi con = 2 -> key1 = 10, key2 = 10 -> Đúng. Vậy key = 10

Số lượng chuỗi con là n. Vì vậy ta hoàn toàn có thể đoán được key.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 06:16:04 (+0700) | #14 | 144337
[Avatar]
Tal
Member

[Minus]    0    [Plus]
Joined: 15/09/2007 16:50:17
Messages: 67
Offline
[Profile] [PM]
Ở đây ta đoán được key trong trường hợp thuật toán lấy chuỗi đơn giản (chuỗi con cách nhau liên tiếp, các chuỗi không nằm lên nhau). Trong trường hợp phức tạp hơn ta phải duyệt qua số chuỗi con là 2^n-1. Phức tạp hơn nữa là khi các chuỗi con sau khi xor được xếp thứ tự khác thứ tự ta lấy từ A.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 08:44:44 (+0700) | #15 | 144373
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

Tal wrote:
Giả sử
- Input String là: A
- Output String là: B

Mã hóa dùng phép toán xor, ta có thể tính toán độ dài của chuỗi con nhập vào để xor với key. Ví dụ:
- Chọn từng ký tự một của A để mã hóa (độ dài chuỗi con là 1)
- Chọn hai ký tự một của A để mã hóa (độ dài chuỗi con là 2)
....

Trong trường hợp này, chuỗi con phải có độ dài bằng độ dài của key. Chuỗi cha nếu như có độ dài không chia hết cho độ dài key, ta phải thêm phần padding (để độ dài A là bội của key)

Ta nhận thấy là dù key thế nào thì chuỗi A và B phải có độ dài bằng nhau. Nhận xét nữa là thứ tự chuỗi con của A và B là giống nhau.

Vậy thì ta sẽ chọn các chuỗi con tương ứng của A, B để xor với nhau -> key.

(Chú ý nữa là nếu key đúng thì khi xor đến lần thứ 2, ta sẽ nhận được key giống key của lần xor thứ 1, còn nếu key sai -> chuỗi con ta chọn là sai. Loại bỏ vòng lặp)

Ví dụ:
A = 0000
B = 1111
(key=1)
chuỗi con =1 -> key = 1

A = 1101
B = 0111
(key=10)
chuỗi con = 1 -> key1 = 1, key2 = 0 -> chuỗi con độ dài 1 là sai. Tăng giá trị chuỗi con
chuỗi con = 2 -> key1 = 10, key2 = 10 -> Đúng. Vậy key = 10

Số lượng chuỗi con là n. Vì vậy ta hoàn toàn có thể đoán được key. 

Đây chỉ là một trường hợp_1 cách để mã hóa trong vô vàn cách.
Phải đợi chủ topic đưa ra cái cách mà chuyển từ A->B

facialz wrote:

seraphpl wrote:

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.
 

Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.
 

Tui nghĩ là mã hóa được. 1 cách tui nghĩ là:
giả sử A = 'ABCD', key = 'EFG'
Gọi dkey là độ dài của key. Ở ví dụ trên là 3
B[i] = A[i] xor key[(i-1) mod dkey+1]
(A[], B[], key[] là giá trị của A, B, key sau khi được chuyển sang hệ nhị phân, hoặc thập phân,....)
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 09:05:58 (+0700) | #16 | 144376
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:

facialz wrote:

seraphpl wrote:

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.
 

Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.
 

Tui nghĩ là mã hóa được. 1 cách tui nghĩ là:
giả sử A = 'ABCD', key = 'EFG'
Gọi dkey là độ dài của key. Ở ví dụ trên là 3
B[ i ] = A[ i ] xor key[(i-1) mod dkey+1]
(A[], B[], key[] là giá trị của A, B, key sau khi được chuyển sang hệ nhị phân, hoặc thập phân,....)[/i] 

Cách này có vẻ giống như là dùng key lặp đi lặp lại. Ví dụ khi mã hóa plaintext "ABCDEF..." thì key "EFG" sẽ được dùng như "EFGEFG...". Như thế chỉ cần biết khoảng 3 ký tự của plaintext là đủ để khám phá key, từ đó khám phá toàn bộ plaintext và phá tan mật mã một cách tầm thường.

Tui biết, ngay chính bản thân cái đề mã hóa nhiều plaintext bằng XOR với một key cố định đã là "củ chuối" lắm rồi. Nhưng cũng không vì thế mà ta còn ráng làm cho nó "củ chuối" hơn. ;-\
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 09:43:05 (+0700) | #17 | 144382
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

facialz wrote:

seraphpl wrote:

facialz wrote:

seraphpl wrote:

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.
 

Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.
 

Tui nghĩ là mã hóa được. 1 cách tui nghĩ là:
giả sử A = 'ABCD', key = 'EFG'
Gọi dkey là độ dài của key. Ở ví dụ trên là 3
B[ i ] = A[ i ] xor key[(i-1) mod dkey+1]
(A[], B[], key[] là giá trị của A, B, key sau khi được chuyển sang hệ nhị phân, hoặc thập phân,....)[/i] 

Cách này có vẻ giống như là dùng key lặp đi lặp lại. Ví dụ khi mã hóa plaintext "ABCDEF..." thì key "EFG" sẽ được dùng như "EFGEFG...". Như thế chỉ cần biết khoảng 3 ký tự của plaintext là đủ để khám phá key, từ đó khám phá toàn bộ plaintext và phá tan mật mã một cách tầm thường.

Tui biết, ngay chính bản thân cái đề mã hóa nhiều plaintext bằng XOR với một key cố định đã là "củ chuối" lắm rồi. Nhưng cũng không vì thế mà ta còn ráng làm cho nó "củ chuối" hơn. ;-\ 

hơ hơ, tui nghĩ là nên suy nghĩ kĩ trước khi nói
giả sử key là "EFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGK" thì tui không biết là bạn giải cái key khi biết 3 kí tự như thế nào.

facialz wrote:
Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.  

=> Củ chuối không có nghĩa là không mã hóa được

<Edit thêm vào phần này>

Nghe bạn nói vậy, tui bèn tìm hiểu thêm 1 chút về ánh xạ
http://vi.wikipedia.org/wiki/%C3%81nh_x%E1%BA%A1
Tui nghĩ là cần tìm toàn ánh f() sao cho X -> Y (Với X là tập hợp các số tự nhiên, Y là tập hợp các số tự nhiên [1..<số phần tử của key>])
Với mỗi vị trí i của A thì ta tìm được 1 vị trí f(i) thuộc [1..<số phần tử của key>]
Lúc này, B [i] = A [i] xor key [f(i)]
Tui chưa thấy ra nó củ chuối chỗ nào, bạn vào chỉ ra xem.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 10:51:08 (+0700) | #18 | 144392
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:

facialz wrote:

seraphpl wrote:

facialz wrote:

seraphpl wrote:

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.
 

Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.
 

Tui nghĩ là mã hóa được. 1 cách tui nghĩ là:
giả sử A = 'ABCD', key = 'EFG'
Gọi dkey là độ dài của key. Ở ví dụ trên là 3
B[ i ] = A[ i ] xor key[(i-1) mod dkey+1]
(A[], B[], key[] là giá trị của A, B, key sau khi được chuyển sang hệ nhị phân, hoặc thập phân,....)[/i] 

Cách này có vẻ giống như là dùng key lặp đi lặp lại. Ví dụ khi mã hóa plaintext "ABCDEF..." thì key "EFG" sẽ được dùng như "EFGEFG...". Như thế chỉ cần biết khoảng 3 ký tự của plaintext là đủ để khám phá key, từ đó khám phá toàn bộ plaintext và phá tan mật mã một cách tầm thường.

Tui biết, ngay chính bản thân cái đề mã hóa nhiều plaintext bằng XOR với một key cố định đã là "củ chuối" lắm rồi. Nhưng cũng không vì thế mà ta còn ráng làm cho nó "củ chuối" hơn. ;-\ 

hơ hơ, tui nghĩ là nên suy nghĩ kĩ trước khi nói
giả sử key là "EFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGK" thì tui không biết là bạn giải cái key khi biết 3 kí tự như thế nào. 


"EFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGK" là key có độ dài 37 ký tự. Trong trường hợp này cần biết khoảng 37 ký tự của plaintext để có thể khám phá toàn bộ key. Nếu plaintext dài hơn 37 ký tự thì mật mã vẫn bị phá một cách ngớ ngẩn.

Bác đừng nghĩ ra thêm cái key 100 ký tự nữa nhé. 100 hay 1 triệu cũng thế thôi.

seraphpl wrote:

facialz wrote:
Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.  

=> Củ chuối không có nghĩa là không mã hóa được 

Nó "củ chuối" là một chuyện, không mã hóa được là chuyện khác. Khi mã hóa bằng phép tính A ^ B thì A và B phải có cùng độ dài.

seraphpl wrote:

Lúc này, B [ i ] = A [ i ] xor key [f(i)]
Tui chưa thấy ra nó củ chuối chỗ nào, bạn vào chỉ ra xem. 


Công thức này đã khá hơn. Muốn biết nó "củ chuối" không thì còn phải phân tích, nhưng chắc chắn là lạc đề. Vì đề bài là lấy plaintext XOR với key chứ không XOR với một chuỗi được sinh ra từ key. Và hai cách này là cực kỳ khác nhau. Bác hiểu chưa?
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 11:13:55 (+0700) | #19 | 144394
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

facialz wrote:

"EFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGK" là key có độ dài 37 ký tự. Trong trường hợp này cần biết khoảng 37 ký tự của plaintext để có thể khám phá toàn bộ key. Nếu plaintext dài hơn 37 ký tự thì mật mã vẫn bị phá một cách ngớ ngẩn.

Bác đừng nghĩ ra thêm cái key 100 ký tự nữa nhé. 100 hay 1 triệu cũng thế thôi.
 

Bạn dùng cái gì để biết là key có 3 kí tự, 37 kí tự, 100 kí tự hay 1 triệu kí tự khi mà bạn đang đi tìm nó smilie)

facialz wrote:

seraphpl wrote:

facialz wrote:
Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.  

=> Củ chuối không có nghĩa là không mã hóa được 

Nó "củ chuối" là một chuyện, không mã hóa được là chuyện khác.
 


Mời bạn xem lại câu khẳng định màu đỏ của chính mình.

facialz wrote:

Khi mã hóa bằng phép tính A ^ B thì A và B phải có cùng độ dài.
 

Cái chúng ta đang bàn luận là A và key, chớ không phải A và B

facialz wrote:

seraphpl wrote:

Lúc này, B [ i ] = A [ i ] xor key [f(i)]
Tui chưa thấy ra nó củ chuối chỗ nào, bạn vào chỉ ra xem. 

Công thức này đã khá hơn. Muốn biết nó "củ chuối" không thì còn phải phân tích, nhưng chắc chắn là lạc đề. Vì đề bài là lấy plaintext XOR với key chứ không XOR với một chuỗi được sinh ra từ key. Và hai cách này là cực kỳ khác nhau. Bác hiểu chưa? 

 
Mời bạn đọc kĩ lại cái phép XOR
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 11:46:19 (+0700) | #20 | 144399
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:

facialz wrote:

"EFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGEFGK" là key có độ dài 37 ký tự. Trong trường hợp này cần biết khoảng 37 ký tự của plaintext để có thể khám phá toàn bộ key. Nếu plaintext dài hơn 37 ký tự thì mật mã vẫn bị phá một cách ngớ ngẩn.

Bác đừng nghĩ ra thêm cái key 100 ký tự nữa nhé. 100 hay 1 triệu cũng thế thôi.
 

Bạn dùng cái gì để biết là key có 3 kí tự, 37 kí tự, 100 kí tự hay 1 triệu kí tự khi mà bạn đang đi tìm nó smilie

Bác dùng cái gì để cấm tôi giả sử là tôi biết độ dài của key?

Là kẻ tấn công, tôi có quyền giả thiết bất cứ điều gì (ngoại trừ giả thiết tôi biết toàn bộ key). Là người phòng thủ, bác không có quyền giả sử điều ngược lại.

Hơn nữa, khi kẻ tấn công đã đoán biết rằng đối thủ sử dụng key lặp đi lặp lại thì có thể giả thiết (hoàn toàn hợp lý) rằng độ dài key không quá lớn. Nên biết hay không biết độ dài key cũng chẳng còn gì quan trọng.


seraphpl wrote:

facialz wrote:

seraphpl wrote:

facialz wrote:
Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.  

=> Củ chuối không có nghĩa là không mã hóa được 

Nó "củ chuối" là một chuyện, không mã hóa được là chuyện khác.
 


Mời bạn xem lại câu khẳng định màu đỏ của chính mình. 

Tôi xem rồi. Có phải bác nghĩ rằng nó "củ chuối" và "không mã hóa được" là hai điều không thể cùng tồn tại? Nếu thế thì e rằng bác nhầm đấy.

seraphpl wrote:

facialz wrote:

Khi mã hóa bằng phép tính A ^ B thì A và B phải có cùng độ dài.
 

Cái chúng ta đang bàn luận là A và key, chớ không phải A và B 

Thì A và key, cũng thế thôi. Bác hãy tưởng tượng B là key.


seraphpl wrote:

facialz wrote:

seraphpl wrote:

Lúc này, B [ i ] = A [ i ] xor key [f(i)]
Tui chưa thấy ra nó củ chuối chỗ nào, bạn vào chỉ ra xem. 

Công thức này đã khá hơn. Muốn biết nó "củ chuối" không thì còn phải phân tích, nhưng chắc chắn là lạc đề. Vì đề bài là lấy plaintext XOR với key chứ không XOR với một chuỗi được sinh ra từ key. Và hai cách này là cực kỳ khác nhau. Bác hiểu chưa? 


Mời bạn đọc kĩ lại cái phép XOR 

Lấy ví dụ này:

key = "EFG"

với i = 0-9, f(i) lần lượt bằng 0, 1, 2, 1, 2, 1, 0, 2, 0, 1

Khi đó cái phép XOR kia sẽ trở thành
B = A xor "EFGFGFEGEF"
Tui hi vọng "EFGFGFEGEF" và "EFG" là đủ khác nhau để bác hiểu "key" và "chuỗi sinh từ key" khác nhau như thế nào.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 13:48:15 (+0700) | #21 | 144421
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
hê hê đọc đi đọc lại một hồi mới biết là mình chuối và bài chuối thế nào.
Muốn làm được cái bài trên trọn vẹn và chính xác hoàn toàn thì
<độ dài A> lớn, bằng, nhỏ <độ dài key>

Thật vậy
Th1 : =
key = A xor B

Th2: >
key = A xor B
Thật sự thì A xor B sẽ có dạng 00..00<key>
Do đó cũng không làm sai bài toán

Trường hợp cuối cùng <độ dài A> < <độ dài key>
thì key = 00..00<A> xor B

facialz wrote:

seraphpl wrote:

Bạn mã hóa từ chuỗi A sang chuỗi B bằng cách nào?
Bạn thử ví dụ: chuỗi A là "ABCD", và key_C là "EFG" rồi bạn tìm chuỗi B từng bước xem sao.
 

Trường hợp này tui nghĩ là không mã hóa được vì key ngắn hơn plaintext.
 

Tui nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì cũng bằng 00..0010111, rồi lúc đó thì muốn xor thế nào mà chẳng đc smilie)

Tui chỉ không hiểu là làm sao chủ TOPIC chuyển được A sang B (từ key) mà lấy A xor B không ra key.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 14:08:10 (+0700) | #22 | 144424
[Avatar]
K4i
Moderator

Joined: 18/04/2006 09:32:13
Messages: 635
Location: Underground
Offline
[Profile] [PM]
Đề nghị đồng chí chủ topic xem thêm một tí về block cipher (mã hóa khối) để rõ thêm cách thức mã hóa. ==> cách giải quyết bài toán ở đây đấy ạ smilie

Thông thường, khi biết key và plain text hoặc encode text thì kiểu gì cũng ra cái còn lại. Trừ phi là có một trình tự nào đó trong quá trình encode/decode dẫn tới không thể suy ngược ra được hàm mã hóa/giải mã.
Sống là để không chết chứ không phải để trở thành anh hùng
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 16:13:24 (+0700) | #23 | 144432
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:

Tui nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì cũng bằng 00..0010111, rồi lúc đó thì muốn xor thế nào mà chẳng đc smilie


Tui lại nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì không bằng 00..0010111, bởi vì chúng là 2 string khác độ dài. Do đó khi key ngắn hơn plaintext, phép XOR không thể thi hành. Nếu nối thêm vào một string 00..00 để làm cho key dài bằng plaintext thì phép XOR sẽ thực hiện được, về hình thức, nhưng không làm thay đổi bản chất vấn đề là đoạn plaintext được XOR với 00..00 sẽ không được mã hóa. Bản chất vấn đề cũng không thay đổi nếu phép "nối dài bằng 00...00" được thay bằng phép "lặp đi lặp lại key đến khi thu được một string dài bằng plaintext". Trong cả 2 trường hợp, độ bất định của key không thể tăng lên mà độ phức tạp cũng chẳng cứu vãn được điều gì.

Cách duy nhất để làm đúng, mà vẫn đảm bảo theo sát phương trình plaintext ^ ciphertext ^ key == 0, là dùng 1 key dài hơn hoặc bằng plaintext, hoặc hạn chế plaintext để nó không dài hơn key.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 21:33:41 (+0700) | #24 | 144440
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

facialz wrote:

seraphpl wrote:

Tui nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì cũng bằng 00..0010111, rồi lúc đó thì muốn xor thế nào mà chẳng đc smilie


Tui lại nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì không bằng 00..0010111, bởi vì chúng là 2 string khác độ dài.
 

Đã chuyển sang nhị phân rồi thì 10111 = 00..0010111 (Đây là 2 số nhị phân chứ không phải 2 string)

facialz wrote:

Do đó khi key ngắn hơn plaintext, phép XOR không thể thi hành. Nếu nối thêm vào một string 00..00 để làm cho key dài bằng plaintext thì phép XOR sẽ thực hiện được, về hình thức, nhưng không làm thay đổi bản chất vấn đề là đoạn plaintext được XOR với 00..00 sẽ không được mã hóa. Bản chất vấn đề cũng không thay đổi nếu phép "nối dài bằng 00...00" được thay bằng phép "lặp đi lặp lại key đến khi thu được một string dài bằng plaintext". Trong cả 2 trường hợp, độ bất định của key không thể tăng lên mà độ phức tạp cũng chẳng cứu vãn được điều gì.
 

Ngay từ đầu, nên bám sát cái đề, "abcd...k123" cũng được gọi là khác "abcd...k456" và hoàn toàn có thể nói "abcd...k456" là chuỗi mã hóa của "abcd...k123". Còn việc làm độ bất định của key tăng lên nhiều hay ít thì lại là 1 vấn đề khác.

facialz wrote:

Cách duy nhất để làm đúng, mà vẫn đảm bảo theo sát phương trình plaintext ^ ciphertext ^ key == 0, là dùng 1 key dài hơn hoặc bằng plaintext, hoặc hạn chế plaintext để nó không dài hơn key
 

key có độ dài nhỏ hơn độ dài plaintext thì cái phương trình plaintext ^ ciphertext ^ key = 0 cũng chẳng sai.

Cuối cùng, key càng dài thì kết quả càng khó đoán hơn là key ngắn. Nhưng ngược lại, key ngắn thì dung lượng để lưu key là nhỏ hơn key dài. Và trong thực tế, để mã hóa dữ liệu lớn thì chẳng lẽ cái chương trình mã hóa lại có dung lượng lớn hơn dữ liệu cần mã hóa.
Và tui nghĩ là
plaintext+key+f() = ciphertext (Với f() là một hàm để mã hóa)
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 31/07/2008 23:31:04 (+0700) | #25 | 144451
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]

seraphpl wrote:

facialz wrote:

seraphpl wrote:

Tui nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì cũng bằng 00..0010111, rồi lúc đó thì muốn xor thế nào mà chẳng đc smilie


Tui lại nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì không bằng 00..0010111, bởi vì chúng là 2 string khác độ dài.
 

Đã chuyển sang nhị phân rồi thì 10111 = 00..0010111 (Đây là 2 số nhị phân chứ không phải 2 string) 


Số nào cũng biểu diễn bằng string. Số nhị phân không phải là ngoại lê. Và khi bác coi chúng là số, bác có thu được gì mới mẻ đâu ngoài việc thực hiện được phép XOR (hình thức) với 00..0010111.

seraphpl wrote:

facialz wrote:

Do đó khi key ngắn hơn plaintext, phép XOR không thể thi hành. Nếu nối thêm vào một string 00..00 để làm cho key dài bằng plaintext thì phép XOR sẽ thực hiện được, về hình thức, nhưng không làm thay đổi bản chất vấn đề là đoạn plaintext được XOR với 00..00 sẽ không được mã hóa. Bản chất vấn đề cũng không thay đổi nếu phép "nối dài bằng 00...00" được thay bằng phép "lặp đi lặp lại key đến khi thu được một string dài bằng plaintext". Trong cả 2 trường hợp, độ bất định của key không thể tăng lên mà độ phức tạp cũng chẳng cứu vãn được điều gì.
 

Ngay từ đầu, nên bám sát cái đề, "abcd...k123" cũng được gọi là khác "abcd...k456" và hoàn toàn có thể nói "abcd...k456" là chuỗi mã hóa của "abcd...k123".  

Tùy bác. Bác coi mã hóa một nửa, thậm chí không mã hóa là những dạng đặc biệt của mã hóa cũng được. Chẳng qua cũng chỉ là một định nghĩa. Nó cũng chẳng đem lại được định lý nào mới mà chỉ đem đến sự nhập nhằng.

seraphpl wrote:
Còn việc làm độ bất định của key tăng lên nhiều hay ít thì lại là 1 vấn đề khác.  

Và đây, sự nhập nhằng. Độ bất định và độ phức tạp để đánh giá tính bảo mật. Khi viết chương trình mã hóa, người ta mong đợi ở đó tính bảo mật. Mã hóa mà lờ bảo mật đi thì mã hóa làm gì?

Luôn tiện, độ bất định của key không tăng, chứ không phải là nó tăng nhiều hay tăng ít. E rằng chỗ "nhập nhằng" này hơi bị cơ bản đấy.


seraphpl wrote:

facialz wrote:

Cách duy nhất để làm đúng, mà vẫn đảm bảo theo sát phương trình plaintext ^ ciphertext ^ key == 0, là dùng 1 key dài hơn hoặc bằng plaintext, hoặc hạn chế plaintext để nó không dài hơn key
 

key có độ dài nhỏ hơn độ dài plaintext thì cái phương trình plaintext ^ ciphertext ^ key = 0 cũng chẳng sai. 


Sự nhập nhằng được lặp lại. "Mã hóa để bảo mật" bị nhập nhằng với "mã hóa chẳng để làm gì". Đúng đắn ở mấy phép XOR này là hình thức bên ngoài. Sai lầm ở trong nội dung. Tui đã nói từ bài trước rùi đó.


seraphpl wrote:
Cuối cùng, key càng dài thì kết quả càng khó đoán hơn là key ngắn. Nhưng ngược lại, key ngắn thì dung lượng để lưu key là nhỏ hơn key dài. Và trong thực tế, để mã hóa dữ liệu lớn thì chẳng lẽ cái chương trình mã hóa lại có dung lượng lớn hơn dữ liệu cần mã hóa.  

Sự nhập nhằng lặp lại một lần nữa. Thực tế cái gì ở đây? Trong thực tế, khi đã mã hóa thì người ta quan tâm đến tính bảo mật. Khi làm ra một thuật toán "mã hóa" mà một key có độ dài thực tế không mã hóa được dữ liệu có độ dài thực tế thì thực tế hơn cả là tìm thuật toán khác. Hoặc trong trường hợp bị khống chế bởi điều kiện của đề bài như trường hợp này, thì chỉ ra giới hạn của thuật toán của mình. Mà trong trường hợp này giới hạn ấy là độ dài của dữ liệu. Còn cố định nghĩa lại khái niệm "mã hóa" để la lớn rằng "thuật toán của tui vẫn là thuật toán mã hóa còn nó có bảo mật hay không lại là chuyện khác", cái đó e rằng không phải là thực tế.


seraphpl wrote:
Và tui nghĩ là
plaintext+key+f() = ciphertext (Với f() là một hàm để mã hóa) 

Kẻ tấn công biết hàm f. Và f không có đối số thì chỉ là một hằng số. Và nếu giả sử f có đối số mà đối số ấy không phải là key thì kẻ tấn công cũng biết luôn đối số này. Hi vọng bác đã tính đến những điều đó khi phát biểu ý nghĩ trên.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 01/08/2008 00:09:40 (+0700) | #26 | 144457
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]

facialz wrote:

seraphpl wrote:

facialz wrote:

seraphpl wrote:

Tui nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì cũng bằng 00..0010111, rồi lúc đó thì muốn xor thế nào mà chẳng đc smilie


Tui lại nghĩ là "EFG" giả sử chuyển sang nhị phân là 10111 thì không bằng 00..0010111, bởi vì chúng là 2 string khác độ dài.
 

Đã chuyển sang nhị phân rồi thì 10111 = 00..0010111 (Đây là 2 số nhị phân chứ không phải 2 string) 


Số nào cũng biểu diễn bằng string. Số nhị phân không phải là ngoại lê.
 

Tui không biết là bạn chuyển cái chuỗi "EFG" sang nhị phân bằng hình thức nào?
Còn tui thì chuyển theo cách A= B=1 C=10 .... AA=11011... (Đây chỉ là một ví dụ đơn giản cho bảng mã A..Z, chưa tính các kí tự khác)
Do đó tui nghĩ là 10111 = 00..0010111, và bác nói nó không bằng nhau thì tui không biết là theo dạng chuỗi thì 00..0010111 sẽ thành cái gì?

facialz wrote:

Và khi bác coi chúng là số, bác có thu được gì mới mẻ đâu ngoài việc thực hiện được phép XOR (hình thức) với 00..0010111.
 

Tui không thấy câu này có liên quan rõ ràng gì tới vấn đề đang tranh luận. Nên xin miễn

facialz wrote:

seraphpl wrote:

facialz wrote:

Do đó khi key ngắn hơn plaintext, phép XOR không thể thi hành. Nếu nối thêm vào một string 00..00 để làm cho key dài bằng plaintext thì phép XOR sẽ thực hiện được, về hình thức, nhưng không làm thay đổi bản chất vấn đề là đoạn plaintext được XOR với 00..00 sẽ không được mã hóa. Bản chất vấn đề cũng không thay đổi nếu phép "nối dài bằng 00...00" được thay bằng phép "lặp đi lặp lại key đến khi thu được một string dài bằng plaintext". Trong cả 2 trường hợp, độ bất định của key không thể tăng lên mà độ phức tạp cũng chẳng cứu vãn được điều gì.
 

Ngay từ đầu, nên bám sát cái đề, "abcd...k123" cũng được gọi là khác "abcd...k456" và hoàn toàn có thể nói "abcd...k456" là chuỗi mã hóa của "abcd...k123".  

Tùy bác. Bác coi mã hóa một nửa, thậm chí không mã hóa là những dạng đặc biệt của mã hóa cũng được. Chẳng qua cũng chỉ là một định nghĩa. Nó cũng chẳng đem lại được định lý nào mới mà chỉ đem đến sự nhập nhằng.
 

Cái tui đang nói là về bài toán của Topic, còn bạn xem cách mã hóa này là không hay hay không tốt thì chỉ là nhận định của riêng bạn_ chẳng liên quan gì cả, và là một vấn đề khác, tui không biết trước khi bạn nhận định mấy cái này là "nhập nhằng" thì không biết bạn học mã hóa qua cái gì, còn tui thì chỉ xem nó là đơn giản cho người mới bắt đầu.

facialz wrote:

seraphpl wrote:
Còn việc làm độ bất định của key tăng lên nhiều hay ít thì lại là 1 vấn đề khác.  

Và đây, sự nhập nhằng. Độ bất định và độ phức tạp để đánh giá tính bảo mật. Khi viết chương trình mã hóa, người ta mong đợi ở đó tính bảo mật. Mã hóa mà lờ bảo mật đi thì mã hóa làm gì?
 

Tại lúc đầu tui thấy bạn không muốn bàn, sợ làm loãng topic gì đó mà smilie

facialz wrote:

Luôn tiện, độ bất định của key không tăng, chứ không phải là nó tăng nhiều hay tăng ít. E rằng chỗ "nhập nhằng" này hơi bị cơ bản đấy.
 

Tăng thì phải có tăng nhiều hay tăng ít chứ, nêu không tăng mà không có tăng nhiều hay tăng ít thì theo tui là nên dùng "không đổi"

facialz wrote:

seraphpl wrote:

facialz wrote:

Cách duy nhất để làm đúng, mà vẫn đảm bảo theo sát phương trình plaintext ^ ciphertext ^ key == 0, là dùng 1 key dài hơn hoặc bằng plaintext, hoặc hạn chế plaintext để nó không dài hơn key
 

key có độ dài nhỏ hơn độ dài plaintext thì cái phương trình plaintext ^ ciphertext ^ key = 0 cũng chẳng sai. 


Sự nhập nhằng được lặp lại. "Mã hóa để bảo mật" bị nhập nhằng với "mã hóa chẳng để làm gì". Đúng đắn ở mấy phép XOR này là hình thức bên ngoài. Sai lầm ở trong nội dung. Tui đã nói từ bài trước rùi đó.
 

Như trên. --> Miễn

facialz wrote:

seraphpl wrote:
Cuối cùng, key càng dài thì kết quả càng khó đoán hơn là key ngắn. Nhưng ngược lại, key ngắn thì dung lượng để lưu key là nhỏ hơn key dài. Và trong thực tế, để mã hóa dữ liệu lớn thì chẳng lẽ cái chương trình mã hóa lại có dung lượng lớn hơn dữ liệu cần mã hóa.  

Sự nhập nhằng lặp lại một lần nữa. Thực tế cái gì ở đây? Trong thực tế, khi đã mã hóa thì người ta quan tâm đến tính bảo mật. Khi làm ra một thuật toán "mã hóa" mà một key có độ dài thực tế không mã hóa được dữ liệu có độ dài thực tế thì thực tế hơn cả là tìm thuật toán khác. Hoặc trong trường hợp bị khống chế bởi điều kiện của đề bài như trường hợp này, thì chỉ ra giới hạn của thuật toán của mình. Mà trong trường hợp này giới hạn ấy là độ dài của dữ liệu. Còn cố định nghĩa lại khái niệm "mã hóa" để la lớn rằng "thuật toán của tui vẫn là thuật toán mã hóa còn nó có bảo mật hay không lại là chuyện khác", cái đó e rằng không phải là thực tế.
 

Bạn đã cắt cái qutoe trong 1 ý của tui thành 2 phần rồi ->

facialz wrote:

seraphpl wrote:
Và tui nghĩ là
plaintext+key+f() = ciphertext (Với f() là một hàm để mã hóa) 

Kẻ tấn công biết hàm f. Và f không có đối số thì chỉ là một hằng số. Và nếu giả sử f có đối số mà đối số ấy không phải là key thì kẻ tấn công cũng biết luôn đối số này. Hi vọng bác đã tính đến những điều đó khi phát biểu ý nghĩ trên. 

 
Tại sao kẻ tấn công biết hàm f()?
Cái f() ở bài trước là tui chỉ giả sử đơn giản thôi, còn lại thì có muôn vàn cách để làm ra f(),
Tui đâu có pâhn tích gì cái f(). Tui chưa hiểu rõ ràng ý của bạn về phần này?
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 01/08/2008 00:57:19 (+0700) | #27 | 144467
facialz
Elite Member

[Minus]    0    [Plus]
Joined: 20/07/2004 03:48:17
Messages: 197
Location: HoChiMinh city
Offline
[Profile] [PM]
Bác seraphl, tui cũng sẽ noi gương bác, cắt bỏ hết những đoạn trên. Đã nói hết ý của mình, tranh luận cũng không còn gì mới.

seraphpl wrote:

facialz wrote:

seraphpl wrote:
Và tui nghĩ là
plaintext+key+f() = ciphertext (Với f() là một hàm để mã hóa) 

Kẻ tấn công biết hàm f. Và f không có đối số thì chỉ là một hằng số. Và nếu giả sử f có đối số mà đối số ấy không phải là key thì kẻ tấn công cũng biết luôn đối số này. Hi vọng bác đã tính đến những điều đó khi phát biểu ý nghĩ trên. 


Tại sao kẻ tấn công biết hàm f()?
Cái f() ở bài trước là tui chỉ giả sử đơn giản thôi, còn lại thì có muôn vàn cách để làm ra f(),
Tui đâu có pâhn tích gì cái f(). Tui chưa hiểu rõ ràng ý của bạn về phần này? 


Tui đã đề cập 1 lần trước đây. Kẻ tấn công chỉ không biết toàn bộ key, còn lại biết tuốt.

Đây là giả thiết mẫu mực và duy nhất được xét khi sơ bộ tiếp xúc với một thuật toán. Tui không nhớ rõ lắm nhưng chắc chắn đây là một nguyên lý có tên hẳn hoi (hình như là Kirhoff hay Bishop gì đó).

Thực tế, kẻ tấn công có thể biết hay không biết điều này điều nọ. Cho nên an toàn nhất là giả sử hắn biết tuốt mọi điều (ngoại trừ toàn bộ key). Nếu thuật toán của bác an toàn trong giả thiết này, nó sẽ càng an toàn hơn khi có vài tham số nào đó hắn không biết.

Bởi vậy, tui thích công thức trước đây của bác hơn:

plaintext[ i ] ^ ciphertext[ i ] ^ key[ f(i) ] == 0 (1)

Và cũng bởi vậy, tui nghĩ công thức mới của bác nên sửa như thế này thì hợp lý hơn

plaintext + ciphertext + f(key) == 0 (2)

Có thể (1) không an toàn, nhưng vì là trường hợp riêng của (2), nó vẫn là hướng đi có lý để dẫn tới một thuật toán an toàn, có dạng (2).

(Cảnh báo: cả 2 công thức trên đều lạc đề. Đề bài là ciphertext ^ plaintext ^ key == 0.)
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 01/08/2008 01:36:46 (+0700) | #28 | 144474
seraphpl
Member

[Minus]    0    [Plus]
Joined: 04/12/2006 19:52:12
Messages: 97
Location: xxx
Offline
[Profile] [PM] [WWW] [Yahoo!] [MSN] [ICQ]
hêhê, tui ghi

Code:
plaintext+key+f() = ciphertext (Với f() là một hàm để mã hóa)


nghĩa là dùng hàm f() rồi xào nấu cái key với cái plaintext thế nào đó để ra ciphertext còn bạn ghi

facialz wrote:
plaintext + ciphertext + f(key) == 0 (2)  

Nếu vậy, thì cũng có thể ghi plaintext + ciphertext + f(key) == 1 hoặc 2 hoặc xyz gì đó cũng chẳng sai

Còn cái f() chỉ là một hàm tượng trưng, trong cái f() đó còn có thể bao gồm các hàm con f1(..), f2(..), ..., fn(..) với mỗi fi(..) là một hàm khác nhau; trong đó có chứa hoặc không chứa các tham số khác nhau hoặc giống nhau; tham số có thể là bất kì cái gì, có thể là kết quả của fj(..) nào đó, có thể là chính plaintext, hoặc....,
nói đi nói lại là thế.

Tui đã nói, cái key [f(i)] ở trên chỉ là một ví dụ đơn giản thôi, còn chuyện bàn về thuật toán mã hóa thế nào cho cứng, an toàn hay không an toàn thì muôn vàn, rất rất nhiều, tui nghĩ không nên đi sâu vào hơn trong Topic này.

Còn chủ Topic lặn đâu mất tiêu rồi, tới giờ cũng chưa biết là làm cách nào mà B = A xor key mà không tìm ngược lại được nữa???
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 01/08/2008 06:58:12 (+0700) | #29 | 144549
[Avatar]
bienxanhlunglinh
Member

[Minus]    0    [Plus]
Joined: 30/08/2005 07:23:16
Messages: 9
Offline
[Profile] [PM]
Em chào Các Anh, Em bận quá, bận túi bụi, topic em viết mà em bận quá, thông cảm cho em 2 ngày nữa nhé.
Vài dòng rồi em phải đi đây. Em rất vui và cám ơn tất cả các Anh - sự nhiệt tình, chia sẻ cùng nhau.., nói chung thấy vui - ko biết nói gì nữa. Em phải đi tí nhé, mai rảnh em quay vào và hỏi thêm các anh nhưng chắc 1 điều là chuỗi nhập vào là tự nhiên (độ dài và kiểu), Key thì đã cố định và không thay đổi chứ ko thể Xor theo kiểu 1 ký tự hoặc cặp ký tự.

Tối em ngồi viết lại xem: [ Đem A xor Key có được B ], rồi [ đem A xor B để tìm Key ]
Em thích cái này, vì Key cố định trong source người dùng ko biết. Mỗi lần nhập A thì B sẽ thay đổi. sau này B sẽ là chuổi bí mật phải có trước khi muốn thực hiện tiếp chuỗi công việc. vì trước khi send file hay gọi Formload đăng nhập App thì Hệ thông sẽ thực hiện tạo chuỗi B, (B sẽ thay đổi mõi lần thực hiện) Sau đó Text_A sẽ invisiable "Readonly" tại người dùng như vậy phải yêu cầu Admin báo chuỗi B là gì để tiếp tục công việc.
Em đi đã nhé, nếu xong cái này thì nhờ tiếp các Anh cái vụ "băm..băm gì đó"

Em vẫn khoái Anh Tal giải thích. Anh tiếp cho em đi. chuỗi nhập vào không hạn chế độ dài và kiểu.
Em chào các Anh.
[Up] [Print Copy]
  [Question]   Re: Xin giúp đỡ bài mã hóa dùng thuật toán Xor 01/08/2008 08:41:24 (+0700) | #30 | 144559
FaL
Moderator

Joined: 14/04/2006 09:31:18
Messages: 1232
Offline
[Profile] [PM]
Cái bài này của đồng chí bienxanhlunglinh giống y chang 1 bài tập ở trong cuốn The C++ Programming Language của Bjarne Stroustrup (Cuốn này được public ở nhiều nơi trên mạng). Bài này nằm trong chương 4. Trong yêu cầu của đề bài về mã hóa có đề xuất phương án mã hóa bằng phép XOR. Ở đây độ dài key không quan trọng, chỉ lần lượt lấy từng ký tự của plaintext XOR với từng ký tự của key. Nếu độ dài của plaintext > độ dài của key thì sử dụng key lặp lại.

Đây là bài tập cơ bản về lập trình C++ nên cũng không nặng nề về vấn đề mã hóa. Hơn nữa không ai mã hóa theo kiểu XOR đơn giản như thế này.


Trong yêu cầu của đề bài có một ghi chú: Cần tìm ra key có giá trị nhỏ nhất. Nghĩa là với key EFGEF chỉ cần lấy EFG. (Vì key này có thể được lặp lại).

2 bác seraphpl và facialz cũng có đưa ra một số hướng thú vị smilie nhưng mà hình như không hiểu ý nhau lắm hay sao ấy.
Hãy giữ một trái tim nóng và một cái đầu lạnh
[Up] [Print Copy]
[digg] [delicious] [google] [yahoo] [technorati] [reddit] [stumbleupon]
Go to: 
 Users currently in here 
1 Anonymous

Powered by JForum - Extended by HVAOnline
 hvaonline.net  |  hvaforum.net  |  hvazone.net  |  hvanews.net  |  vnhacker.org
1999 - 2013 © v2012|0504|218|