2009-10-20 10 views
0

J'ai un module qui RSA crypte les données et les transmet au C#. C# a besoin de le déchiffrer en fonction de la clé publique (encodée en 64 bits) et du jeton transmis.Java Encryption C# Decryption

J'ai un jeton, une clé publique codée en 64 bits, peut-on m'aider à obtenir l'échantillon pour commencer. Tout ce que je sais de Java est, il utilise. J'ai le résultat de la fin de Java et ai besoin d'écrire un analyseur en C# pour déchiffrer ceci. J'obtiens à la fois la clé publique et le jeton en tant que valeur de chaîne.

Cipher cipher = Cipher.getInstance(ALGORITHM); //Algorithm = "RSA" 
    cipher.init(Cipher.DECRYPT_MODE, key); 

Merci

+0

Veuillez regarder la mise à jour à ma réponse. – erickson

Répondre

1

Pour commencer, vous aurez besoin de la clé privée pour décrypter le message. Par "clé publique (codée en 64 bits)", je devine ce que vous avez vraiment un certificat encodé Base-64 –, avec une ligne d'en-tête qui dit "----- BEGIN CERTIFICATE -----" et un pied de page qui dit "----- CERTIFICAT FIN -----".

Si c'est correct, vous devez trouver la clé privée. Ceci est parfois stocké dans un fichier au format PKCS # 12, avec une extension ".p12" ou ".pfx". Vous aurez besoin d'un mot de passe pour accéder à la clé privée si elle est stockée dans un tel fichier. OpenSSL et d'autres utilitaires utilisent des fichiers de clés privées qui peuvent être codés en Base-64 – ou binaires. Ceux-ci ont une variété d'extensions, et peuvent ou non être protégés par mot de passe. Si le fichier que vous avez a une ligne d'en-tête de "----- BEGIN RSA PRIVATE KEY -----" ou "----- BEGIN PRIVATE KEY -----", c'est en fait la clé privée . Enfin, Windows peut stocker des clés privées dans son magasin de clés interne.

Lorsque vous clarifiez l'emplacement de la clé privée, veuillez mettre à jour votre question.


Si la clé privée est utilisée du côté Java, cela peut être une tentative d'exécution d'une signature numérique. Alors que tous les fournisseurs Java que j'ai testés produisent des résultats corrects quand (ab) est utilisé de cette façon, si vous faites une signature, la classe Signature doit être utilisée. Le code C# doit également utiliser un objet de signature pour "vérifier" la signature.

Le chiffrement est effectué avec la clé privée. Puisque la clé publique est publique, n'importe qui peut déchiffrer le message; c'est-à-dire que le message n'est pas confidentiel. Les clés publiques sont utilisées par les destinataires pour vérifier les messages signés.

+0

Le codage est effectué à l'aide de la clé privée côté Java. Je suppose que la clé publique peut être utilisée dans C# fin pour décrypter cela? – bkhanal

+0

Merci. Donc, étant donné que j'ai la clé publique (pas le certificat) - je pense que je peux l'obtenir, mais le code me passe la clé du certificat à la place, où dois-je commencer? :) ... – bkhanal

1

Vérifiez ce code.

public static string Decrypt(string inputText) 
     { 
     RijndaelManaged rijndaelCipher = new RijndaelManaged(); 
     byte[] encryptedData = Convert.FromBase64String(inputText.Replace(" ","+")); 
     PasswordDeriveBytes secretKey = new PasswordDeriveBytes(ENCRYPTION_KEY, SALT); 

     using (ICryptoTransform decryptor = rijndaelCipher.CreateDecryptor(secretKey.GetBytes(32), secretKey.GetBytes(16))) 
     { 
      using (MemoryStream memoryStream = new MemoryStream(encryptedData)) 
      { 
      using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read)) 
      { 
       byte[] plainText = new byte[encryptedData.Length]; 
       int decryptedCount = cryptoStream.Read(plainText, 0, plainText.Length); 
       return Encoding.Unicode.GetString(plainText, 0, decryptedCount); 
      } 
      } 
     } 
+0

RijndaelManaged: ressemble à un algorithme différent pour moi? – bkhanal