2011-12-14 257 views
5

如果我想寫一個凱撒密碼C#我必須通過每個案例?對於我來說,轉換爲ASCII或UTF是沒有意義的(可能是因爲我不明白它是如何工作的)。我只需要一個正確的方向。凱撒密碼C#

我應該爲每個字母分配數字1-26嗎?

回答

2

你可以把每個字母到一個數組,並使用數組索引(纏繞在後)或到達最後一個時,你可以簡單地使用字母的asccii價值,換到第一位。這裏的技巧是,所有的人物都coninuously排序,起始於A = 0×41

+0

謝謝!這對我有意義,我沒有意識到我可以做到這一點(我是一個完整的初學者!)。 –

1

對於一個傳統的凱撒塞浦路斯,你會檢查一個字符在[a-z]或[A-Z]範圍內,並且只是通過它否則。

另一種方法是以相同的方式處理所有字符,所以不僅a變爲b,而且μ變成¶並且在U + 10FFFF(Unicode中最高的編碼點)處環繞變爲U + 0000(前者是一個非字符,後者是一個空字符,但沒有理由爲什麼一個string不能讓他們傳輸到另一個地方。

在這兩者之間,是作用於UTF-16。 ,你只需在每個char的值上加1,然後將U + FFFF換成U + 0000即可。輸出可能成爲一個無效的UTF-16字符串(因爲它可能不匹配surrogates,但這不會阻止你從string中傳遞出去,然後再次解密。畢竟,現代加密不會導致有效的字符串。

+0

這是我不明白,如果我想解碼一個簡單的句子,我將其轉換爲代碼,我可以限制的範圍內,這樣,當我想「Z」,以比如'b',我是否總是必須來回走動,我能不能把它變成類似於一個車輪?並感謝您的答案。 –

+0

這是規範,而不是工作的事(可悲的是,大多數現實生活中的併發症都是這樣過,編程比上班什麼客戶真正想要更容易)。我會說第一個*可能*是什麼意圖。 你是什麼意思「沒有類似於車輪」的意思,撒暗號的任何變種類似於車輪。 –

+0

我的意思是包裝 - 正如我從另一個答案=)中發現的那樣 - 我應該寫下_不能讓它變成類似的。我仍然習慣這些條款。 –

2

或許給出提示將是有益的 - 你說你不想複製或被告知的答案:

  • 考慮C#以模數運算符爲特徵,形式爲a = b%c - 即b的餘數除以c。當c = n和b = n時,a = 0。當c = n和b = n + 1時,a = 1。試驗該運算符的行爲。
  • 您可以靜態地在C#與initialisers聲明數組:char[] chars = new char[]{'a', 'b',...};
+0

也是一個很好的幫助,謝謝! –

1

這是我的做法。

public static string Encrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Encrypt(x, n))); 
    } 

    public static string Decrypt(string str, int n) 
    { 
     return string.Join("", str.Select(x => Decrypt(x, n))); 
    } 

    public static char Encrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x + n) % 26)); 
    } 

    public static char Decrypt(char chr, int n) 
    { 
     int x = chr - 65; 

     return (char)((65) + ((x - n) % 26)); 
    } 

P.S.

只適用於大寫字母。

閱讀維基百科的文章:Caesar cipher