Question

J'utilise un certificat généré par makecert qui possède une clé privée et une clé publique. Le côté java utilise cette clé publique pour chiffrer les données et .net les déchiffre.

J'essaie de déchiffrer la chaîne encodée en 64 bits de Java et de récupérer les mauvaises données.

Pour voir si tout va bien. Fin Internet, j’ai essayé de chiffrer avec la clé publique, puis de déchiffrer avec privé en utilisant le même certificat. Mon code ressemble à ceci.

X509Certificate2 cert = GetCert(key, StoreName.My, StoreLocation.LocalMachine);
RSACryptoServiceProvider provider =  (RSACryptoServiceProvider)cert.PrivateKey;

RSACryptoServiceProvider publicprovider = (RSACryptoServiceProvider)cert.PublicKey.Key;

if (cert.HasPrivateKey)
    MessageBox.Show("Got private key");

byte[] encrypted = publicprovider.Encrypt(Encoding.UTF8.GetBytes(text), false);
byte[] decryptedBytes = provider.Decrypt(encrypted, false); 

Même ici, je reçois l'erreur. Est-ce que je manque quelque chose?

Le certificat semble valide avec les clés publique et privée.

Était-ce utile?

La solution 4

J'ai finalement trouvé le problème. Je ne mettais pas la clé pour que makecert la définisse comme clé RSA Crypto.

Autres conseils

J'ai eu le même problème avec un certificat auto-signé, le problème était que je générais le certificat avec le commutateur -sky signature au lieu de -sky exchange ( vous utilisez la signature pour la signature et l'échange pour le chiffrement / déchiffrement)

Voici ma commande complète pour makecert qui fonctionne:

makecert -r -pe -a sha1 -n "CN=MyName" -ss my -sr CurrentUser -sky exchange

Le code suivant fonctionne bien pour moi:

        RSACryptoServiceProvider privateKey = new RSACryptoServiceProvider();
        privateKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent><P>83xxN7jvpg5z16pxz2tIQIdqd/EfmikR9Q2TjG2tosWkUSvtyx0xHZ9EqdTUbSGZZ+jgrabzkafYc7Mplylwew==</P><Q>yqcnYSZEXHwJvRWi2V09PNEENTozQZywcFptUUGar9TciaQvoNv3lpnfzUKNBRdhzq4lImxkamajZlTWE5buUw==</Q><DP>37HqilkbwyHwB6mOGhPkM3S1ujAK6qTk3JB2iEOTjMGrru9+7maJYz+Z47Wm3ARMXgyzrpZ9m8nqsJFfmoL11Q==</DP><DQ>v285tv8kMs2FkZYfuP/oOkwkkneBNejjj68Md2bmzlThZDCyQV2pvB1tmgPVHUsiPNCrCaKlFRISJzfa5rR8Ow==</DQ><InverseQ>fgJE2TRe/SS+YqW0/I+FtHrdfbbao0/R3pHD4r4oceZQUemlBgZ7DxOAetebHKthlOdjGkmfWYB8EU4XoWggqw==</InverseQ><D>FMLCwjy3wbAKiCANp6XFAJgz1o7365NFv0k41BpvasViTa4TgFFWH2ROJ7M9g0lPqJy+YrhrHcY9mqV5TVjTheQp0JeckrgO2B39XngPMAMMdne3rWGpf0Pfbj3FLfchMk6XYDXSZzCS2CmSeRA4aBMb+4R3YurixyJLrnGRMH0=</D></RSAKeyValue>");
        RSACryptoServiceProvider publicKey = new RSACryptoServiceProvider();
        publicKey.FromXmlString("<RSAKeyValue><Modulus>wL8s+C8SnnlaaqR+VsyijmxOJOARNa4o7ZNsqfy3+9J9Ol2JNSjjMfQWoUnFtClzJBlZhU5KtuazQe8ZKXTX9YvKoJdRhlsonZkC04qiTMdO/FZIH00GrCRxeQ7XDnQnvPB9Bdsvs//7zrY3f7eLIkpIyK9cQHU+5jjJd5IT0eE=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>");

        {
            string text = "foo";
            byte[] encrypted = publicKey.Encrypt(Encoding.UTF8.GetBytes(text), false);
            byte[] decryptedBytes = privateKey.Decrypt(encrypted, false);
        }

Pouvez-vous vérifier que la clé privée exportée provient de cert.PrivateKey et que la clé publique provient de cert.PublicKey.Key?

Je suis tombé sur cette page en essayant de trouver des exemples d'utilisation de makcert avec des certificats x509 et rsa utilisant c #. Malheureusement, cela n'a fourni qu'une partie de la solution. J'ai rassemblé tous les éléments dans une entrée de blog susceptible d'intéresser les internautes. Vous pouvez le trouver ici: http://nick-howard.blogspot.com /2011/05/makecert-x509-certificates-and-rsa.html

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top