Besoin de consulter sur convertir un code Java sipnet en c#


J'ai le code Java suivant:

static final String KEY_STRING = "MOGO_APP";

public static byte[] decrypt(byte[] encrypt)
{
    byte[] bArr = null;
    Key key = new SecretKeySpec(KEY_STRING.getBytes(), "DES");
    Cipher cipher = Cipher.getInstance("DES");
    cipher.init(2, key);
    bArr = cipher.doFinal(encrypt);
    return bArr;
}

Je veux le traduire en c#. Voici ce que je fais:

const string KEY_STRING = "MOGO_APP";

public static byte[] decrypt(byte[] encrypt)
{
    byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);

    DESCryptoServiceProvider cryptoProvider = new DESCryptoServiceProvider();
    cryptoProvider.Key = key;

    using (MemoryStream mm = new MemoryStream())
    {
        using (CryptoStream cs = new CryptoStream(mm,
            cryptoProvider.CreateDecryptor(), CryptoStreamMode.Write))
        {
            cs.Write(encrypt, 0, encrypt.Length);
        }
        return mm.ToArray();
    }
}

Mais il ne donne pas le même résultat que le code Java.

Je ne connais pas Java. Mais d'après ce que j'ai cherché, je pense que je peux avoir l'erreur suivante:

  • key peut ne pas être le même, car KEY_STRING.getBytes() dépend de l'application (ou du système?) jeu de caractères.
  • L'alogrithme converti peut ne pas être le même avec l'orignal.

Je reçois aussi des erreur The specificed key is not valid size.

Je fais conversion étape par étape donc je n'ai pas d'exemples de données d'entrée et de sortie, désolé. Suggérez-vous où est l'erreur et comment la corriger?

Author: Tuyen Pham, 2016-11-27

2 answers

Vous avez déjà trouvé votre solution, c'est le getBytes() / GetBytes() appels. Vous devez spécifier explicitement le codage d'octets à utiliser et vous assurer que C# et Java utilisent le même codage d'octets. L'utilisation de la valeur par défaut du système est généralement une erreur, puis une écriture sur plusieurs plates-formes. Choisissez un encodage: ASCII, UTF-8 ou autre et spécifiez explicitement qu'il est le même des deux côtés.

 1
Author: rossum, 2016-11-27 12:18:08

Après des heures de recherche et de lecture, j'ai trouvé la solution. Le mode de chiffrement par défaut en Java est BCE, alors que dans C# est CBC. Beuglant est le code travaillé:

const string KEY_STRING = "MOGO_APP";

public static byte[] decrypt(byte[] encrypt)
{
    byte[] key = Encoding.ASCII.GetBytes(KEY_STRING);

    DESCryptoServiceProvider cp = new DESCryptoServiceProvider();
    cp.Mode = CipherMode.ECB;
    cp.Key = bytes;
    ICryptoTransform i = cp.CreateDecryptor();
    return i.TransformFinalBlock(encrypt, 0, encrypt.Length); 
}
 0
Author: Tuyen Pham, 2016-11-28 05:24:43