2009-03-18 26 views
0

Tout d'abord, je ne suis pas un programmeur Java. Je cherche un exemple de solution à ce problème parce que le développeur Java que j'ai n'a pas beaucoup d'expérience de travail avec le cryptage. Tout ce que nous avons trouvé en ligne concerne le cryptage de pages Web et le traitement du keystore MS. Nous voulons juste travailler avec une seule chaîne de PowerBuilder (PB) et être capable de la décrypter en Java. La restriction ici est la bibliothèque MS. En raison de certaines limitations, nous sommes bloqués par l'utilisation de cette méthode de chiffrement, c'est donc du côté Java de gérer ce qui est lancé.Besoin d'un exemple - chaîne de décryptage en Java en utilisant Microsoft Crypto API

Ce que j'ai un programme PB version 10.2 qui doit appeler cet utilitaire Java et lui passer un mot de passe & nom d'utilisateur. Nous essayons de crypter le mot de passe en tant que chaîne conviviale, car c'est ainsi que PB va appeler l'application Java.

PB J'utilise l'objet suivant: http://www.topwizprogramming.com/freecode_crypto.html

Qu'est-ce que le code fait, est enroulant l'API cryptographique Microsoft trouvés dans advapi32.dll. Les fonctions qu'il utilise sont:

CryptAcquireContext http://msdn.microsoft.com/en-us/library/aa379886(VS.85).aspx

CryptCreateHash http://msdn.microsoft.com/en-us/library/aa379908(VS.85).aspx

CryptHashData http://msdn.microsoft.com/en-us/library/aa380202(VS.85).aspx

CryptDeriveKey http://msdn.microsoft.com/en-us/library/aa379916(VS.85).aspx

CryptEncrypt Il utilise le fournisseur cryptographique Microsoft Strong et PROV_RSA_FULL. Le code prend les données à chiffrer, les convertit en BLOB qui est ensuite transmis aux fonctions de chiffrement. Là, il accuse un contexte, crée un objet de hachage à partir du contexte, hache le mot de passe, obtient une clé de session à partir du hachage, puis appelle encrypt/decrypt. La dernière chose est qu'il prend le BLOB retourné et le convertit en une chaîne sous le jeu de caractères ANSI.

Il y a un certain nombre de constantes qui, à un coup d'oeil, je comprends où certains viennent, d'autres pas tellement: constante chaîne KEY_CONTAINER = "MyKeyContainer" Constant ULONG PROV_RSA_FULL = 1 constante ULONG CALG_MD5 = 32771 Constant ULONG CALG_RC4 = 26625 constante ULONG ENCRYPT_ALGORITHM = CALG_RC4 constante ULONG CRYPT_NEWKEYSET = 8 constante ULONG ERROR_MORE_DATA = 234

Que cela se fasse à 1,5 en utilisant quelque chose comme BouncyCastle ou 1.6 avec l'interface Sun Crypto pour MS Je ne me soucie pas, nous Je meurs d'envie de voir ce travail et je suis est au-dessus de nos têtes.


Hey i besoin de crypte une chaîne et stocker un fichier, puis-je lire à nouveau le fichier et décrypter la même chaîne de retour. Mais je ne veux pas crypter le fichier entier. Une fois la valeur cryptée requise stockée dans le fichier, je dois la convertir seule en chaîne d'origine. Pouvez-vous s'il vous plaît m'aider avec l'exemple de code.

+0

Ce que vous essayez de faire n'est pas clair. Voulez-vous dupliquer ce processus de cryptage en Java? Voulez-vous décrypter certaines données cryptées avec ce processus en Java? Décrivez la fonctionnalité requise du code Java que vous voulez. – erickson

+0

En outre, si vous souhaitez dupliquer ou inverser le cryptage que vous décrivez, il serait utile d'avoir quelques cas de test avec entrée et sortie attendues. – erickson

+0

Ce que j'ai donné ci-dessus était toutes les informations pertinentes (je pense) que je pouvais trouver avec mes composants PB afin que quelqu'un sache ce que je suis en train d'essayer de travailler sur le côté Java. Je ne suis pas sûr de savoir comment le dire autrement; J'ai une application PB qui génère une chaîne cryptée et j'ai besoin de décrypter cette chaîne en Java. –

Répondre

4
import java.security.GeneralSecurityException; 
import java.security.MessageDigest; 

import javax.crypto.Cipher; 
import javax.crypto.spec.SecretKeySpec; 

public class Decrypt 
{ 

    public static void main(String... argv) 
    throws Exception 
    { 
    byte[] password = "password".getBytes("UTF-8"); 
    byte[] ciphertext = { -68, -112, 66, 78, 85, 50, 22, -63, 
          16, 24, -45, 4, -116, -14, 88, 34, 
          -85, 116, 105, 59, 45, -126 }; 
    byte[] plaintext = decrypt(password, ciphertext); 
    System.out.println(new String(plaintext, "UTF-8")); 
    } 

    public static byte[] decrypt(byte[] password, byte[] ciphertext) 
    throws GeneralSecurityException 
    { 
    MessageDigest digest = MessageDigest.getInstance("MD5"); 
    byte[] hash = digest.digest(password); 
    Cipher rc4 = Cipher.getInstance("RC4"); 
    rc4.init(Cipher.DECRYPT_MODE, new SecretKeySpec(hash, "RC4")); 
    return rc4.doFinal(ciphertext); 
    } 

} 

N.B.:

Ce "cryptage" est horrible. RC4 est un chiffrement de flux de clé. N'utilisez jamais la même clé de chiffrement de clé pour plus d'un message! En utilisant le même mot de passe de cette manière pour plusieurs messages, il est trivial de récupérer le texte brut et la clé à partir de plusieurs textes chiffrés. Compte tenu de la faiblesse de MD5, ils peuvent probablement récupérer le mot de passe aussi. Ces failles sont suffisantes pour compromettre un bon chiffrement de flux, mais RC4, comme MD5, a ses propres vulnérabilités et n'est pas recommandé pour les nouvelles applications. Je suis sûr que vous saviez tout cela, et êtes limité par certaines applications héritées, mais si d'autres personnes voient cette réponse, ils doivent comprendre que la bibliothèque "crypto" PowerBuilder que vous êtes obligé d'utiliser est implémentée de façon incompétente.


Depuis l'entrée de chiffrement et la sortie est toujours, un codage de texte « binaire » est couramment utilisé comme base 64 ou Base-85 quand le texte chiffré doit passer à travers un canal orienté texte (comme le ligne de commande). Si possible, pouvez-vous Base-64 coder le texte de chiffrement avant d'appeler l'utilitaire Java? Cela vous isolerait de tout problème d'encodage de caractères.

+0

Merci erickson Le seul problème que nous avons à ce stade est le jeu de caractères Conversion de l'argument avec Cp1252 nous 99 % là mais quelques combos avec des espaces dans les données originales nous donnent des ordures. ys de traiter avec cela. Merci beaucoup. –