簡體   English   中英

Java Cipher.getInstance(“ RSA / ECB / NoPadding”); 等價於C#? 我無法在.net Framework應用程序中加密消息

[英]Java Cipher.getInstance(“RSA/ECB/NoPadding”); equivalent in C#? I can't encrypt message in .net framework application

我的朋友使用Java只是簡單的方法:

 public static byte[] encrypt(byte[] msg, PrivateKey key) throws InvalidKeyException, BadPaddingException, IllegalBlockSizeException, NoSuchPaddingException, NoSuchAlgorithmException {
        final Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        return cipher.doFinal(msg);
    }

我需要在C#中以相同的方式加密消息。 我嘗試使用

RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
provider.FromXmlString(privkey);
byte[] encryptedEverything = provider.Encrypt(message, false/*tried every options of this constructor*/);

但是我有一個System.Security.Cryptography.CryptographicException: 'Bad Length.' 當我將我的byte[256]消息拆分為兩個byte[128]消息時,先簽名,然后合並它們,最后我得到了byte [512]消息。 我知道為什么,但是我不得不嘗試。

如何使用c#.net Framework簽名此消息? Java Cipher是否有等​​效功能? .net在加密方面看起來非常謹慎,我不知道為什么。

您的朋友有一種簡單的不安全方法來執行加密。 您永遠不要使用“ NoPadding”,因為那樣會使用“教科書”或“原始” RSA。 若要顯示可能的攻擊方式,請在此處找到(注意為此特定目的詢問問題的人員)。 NoPadding實際上在Microsoft類中不可用-我認為使用null

此外,要加密較大的消息,您應該使用混合加密 ,其中使用公共RSA密鑰包裝(/加密)隨機生成的AES密鑰,然后使用消息特定的AES密鑰來加密數據。 這樣,您可以加密任何大小的消息,而對於1024位RSA密鑰,則只需花費128字節的一次性開銷(這與加密消息的性能大小有關)。

但是,您希望使用大於1024位的密鑰大小,但至少要加倍密鑰大小。 我還將考慮使用OAEP方案之一。 PKCS#1填充可能存在攻擊,因此,可以說這些攻擊的安全性低於較新的OAEP方案。

RSACryptoServiceProvider ,不鼓勵使用RSACryptoServiceProvider因為它僅適用於Windows。 我通常要做的是將我的公共密鑰和私有密鑰設置為PEM格式 ,並使用我前一段時間寫的幫助程序庫加載它。

這是一個示例,該示例將加載PEM私鑰並使用PKCS#1加密一些數據:

var privateKeyString = File.ReadAllText(privateKeyPath);
var rsa = PemExt.DecodeRsaPrivateKey(PemExt.GetBytesFromPem(privateKeyString, "RSA PRIVATE KEY"));
var encryptedEverything = rsa.Encrypt(message, RSAEncryptionPadding.Pkcs1);

如果您還具有公共密鑰,則可以使用Pem.GetCertificateAndKey方法加載這兩個方法,該方法要簡單得多。

var privateKeyString = File.ReadAllText(privateKeyPath);
var publicKeyString = File.ReadAllText(publicKeyPath);
var (cert, rsa) = Pem.GetCertificateAndKey(publicKeyString, privateKeyString);
var encryptedEverything = rsa.Encrypt(message, RSAEncryptionPadding.Pkcs1);

暫無
暫無

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

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