簡體   English   中英

在朴素的RSA實現中將字母轉換為數字的好方法嗎?

[英]Good ways of converting letters to numbers in naive RSA implementation?

我正在實施一個簡短的RSA程序,並具有以下代碼:

private string Encrypt(string data)
{
    BigInteger dataAsBigInteger = new BigInteger(Encoding.UTF8.GetBytes(data));

    BigInteger remainder = BigInteger.ModPow(dataAsBigInteger, exponentE, CalculatePublicKey());

    return Convert.ToBase64String(remainder.ToByteArray());
}

private string Decrypt(string data)
{
    BigInteger dataAsBigInteger = new BigInteger(Convert.FromBase64String(data));

    BigInteger remainder = BigInteger.ModPow(dataAsBigInteger, CalculatePrivateKey(), CalculatePublicKey());

    return Encoding.UTF8.GetString(remainder.ToByteArray());
}

不幸的是,我似乎得到的結果是奇怪的ASCII值。 我嘗試僅使用數字而不是文本和Decrypt(Encrypt(number)) == number所以我知道算法很好,所以我認為由於將字節數組與字節數組相互轉換並對其執行操作而使算法混亂。

如果這不起作用,我正在考慮一個更好的主意,那就是將字母轉換為數字的公式。 我不能做A = 1, B = 2, etc.依此類推,因為11與K (11th letter)是不明確的。 也許每個字母的位置(A = 1, B = 2, etc.)首先乘以10,然后您會知道下一個字母以非零值開頭嗎?

是這樣的建議還是可以挽救字節數組?

原則上,只要生成的BigInteger不為負數或大於模數,您的方案就應該起作用。


如果使用了加密安全的RSA實現(例如OAEP),那么您還需要減去填充的開銷。 通常,盡管您只應加密對稱密鑰並使用混合密碼術以允許幾乎任意的消息大小。

您嘗試做的事情沒有意義。 RSA只能加密固定長度的消息,即與公共模數n數量級相同的整數。 (具體地,如果明文m,取為一個數字,是足夠小,M E <n,則加密是平凡可逆的,並且如果它是大於 n,就不能在所有加密。)

此外,您似乎正在嘗試實施不安全的教科書RSA ”。 您需要重新設計應用程序,以使其代替使用RSA作為密鑰封裝方案的一部分,該方案可以安全地提供對稱(例如AES)密鑰,該密鑰在經過身份驗證的操作模式下用於加密實際消息。

對設計的這種更正也將使您的編碼問題變得毫無意義,因為現在正使用在位流而非數字上運行的對稱密碼對適當的消息進行加密。

如果C#沒有為您執行此操作的庫,我將感到非常驚訝。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM