سؤال

أرجوك لا تسألني لماذا.لدي هذا الكود في .صافي تشفير/فك تشفير سلاسل البيانات.أحتاج الآن إلى بالضبط نفس funcionality في جاوة.لقد حاولت عدة أمثلة DESede سرداب ، ولكن أيا منها لا يعطي نفس النتائج كما في هذه الفئة .صافي.

حتى ولو على جعل .صافي webserbvice وراء ssl لخدمة هذا طريقتين يكتب في .صافي وإنما هو مجرد غبي جدا القيام به دون استنفاد جميع تخل.

ربما البعض منكم جافا الناس التي هي أكثر ذات الصلة في المنطقة سوف يكون على قمة رؤساء كيفية تحقيق ذلك.

شكرا !!!

public class Encryption
{
  private static byte[] sharedkey = {...};
  private static byte[] sharedvector = {...};

  public static String Decrypt(String val)
  {
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    byte[] toDecrypt = Convert.FromBase64String(val);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, tdes.CreateDecryptor( sharedkey, sharedvector ), CryptoStreamMode.Write);

    cs.Write(toDecrypt, 0, toDecrypt.Length);
    cs.FlushFinalBlock();
    return Encoding.UTF8.GetString(ms.ToArray());
  }

  public static String Encrypt(String val)
  {
    TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
    byte[] toEncrypt = Encoding.UTF8.GetBytes(val);
    MemoryStream ms = new MemoryStream();
    CryptoStream cs = new CryptoStream(ms, tdes.CreateEncryptor( sharedkey, sharedvector ), CryptoStreamMode.Write);
    cs.Write(toEncrypt, 0, toEncrypt.Length);
    cs.FlushFinalBlock();
    return Convert.ToBase64String(ms.ToArray());
  }
}

Samle الإدخال/الإخراج

String plain = "userNameHere:passwordHere";
Console.WriteLine("plain: " + plain);


String encrypted = Encrypt(plain);
Console.WriteLine("encrypted: " + encrypted);
// "zQPZgQHpjxR+41Bc6+2Bvqo7+pQAxBBVN+0V1tRXcOc="

String decripted = Decrypt(encrypted);
Console.WriteLine("decripted: " + decripted); 
// "userNameHere:passwordHere"
هل كانت مفيدة؟

المحلول

التعليمات البرمجية التالي, ولكن أولا بعض الملاحظات.

  1. مختلفة التهيئة ناقلات يجب أن يختار كل رسالة.الثابت-ترميز التهيئة ناقلات لا معنى له.الرابع يجب أن يتم إرسالها جنبا إلى جنب مع النص المشفر إلى مستلم الرسالة (إنه ليس سرا).
  2. هذا هو بلدي فئة فائدة على قاعدة 64 الترميز.يمكنك استخدام sun.misc.BASE64Encoder و sun.misc.BASE64Decoder بدلا من استخدام طرف ثالث مكتبة مثل BouncyCastle ، أو الكتابة الخاصة بك.
  3. كنت تستخدم 2-مفتاح DES الثلاثي ، حيث أول مفتاح و المفتاح الثالث هو نفسه.أنا تعديل sharedkey لتعكس هذا منذ جافا DESede الشفرات دائما يتطلب 192 بت مفتاح ؛ تصل إلى مولد مفتاح التعامل مع القفل الخيار.
  4. سي بي سي الرابع هو فقط 64 بت.لقد استعملت الأولى فقط 64 بت sharedvector.

هذه الفئة ينبغي أن بين-تعمل مع C# الإصدار.

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

public class Encryption
{

  private static byte[] sharedkey = {
    0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11, 
    0x12, 0x11, 0x0D, 0x0B, 0x07, 0x02, 0x04, 0x08, 
    0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
  };

  private static byte[] sharedvector = {
    0x01, 0x02, 0x03, 0x05, 0x07, 0x0B, 0x0D, 0x11
  };

  public static void main(String... argv)
    throws Exception
  {
    String plaintext = "userNameHere:passwordHere";
    String ciphertext = encrypt(plaintext);
    System.out.println(ciphertext);
    System.out.println(decrypt(ciphertext));
  }

  public static String encrypt(String plaintext)
    throws Exception
  {
    Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    c.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
    byte[] encrypted = c.doFinal(plaintext.getBytes("UTF-8"));
    return Base64.encode(encrypted);
  }

  public static String decrypt(String ciphertext)
    throws Exception
  {
    Cipher c = Cipher.getInstance("DESede/CBC/PKCS5Padding");
    c.init(Cipher.DECRYPT_MODE, new SecretKeySpec(sharedkey, "DESede"), new IvParameterSpec(sharedvector));
    byte[] decrypted = c.doFinal(Base64.decode(ciphertext));
    return new String(decrypted, "UTF-8");
  }

}

الإخراج:

zQPZgQHpjxR+41Bc6+2Bvqo7+pQAxBBVN+0V1tRXcOc=

userNameHere:passwordHere

نصائح أخرى

حصلت بعض المشاكل ،

  1. المفتاح الخاص بك يجب أن يكون 24 بايت إذا كنت تريد توليد نفس المواد الرئيسية على حد سواء .NET و Java.
  2. الرابع يجب أن يكون حجم الكتلة ، وهو 8 بايت DES الثلاثي.
  3. في جافا, تحتاج إلى تحديد الوضع الافتراضي و الحشو الذي هو "DESede/CBC/NoPadding".

بعد إجراء هذه التغييرات, يجب أن تكون قادرة على فك تشفير على جافا الجانب.

هل تأكدت من يستخدم رمز. NET نفس الحشو كما رمز جافا؟ لا أرى أي الحشو المحدد في التعليمات البرمجية. NET، لهذا السبب أطلب.

هل يحدث لديها مصدر لرمز جافا، فإنه سيتم مساعدة في العثور على الأخطاء.

جرب ما يلي. للاستخدام الفعلي، أود أن أحصل على مكتبة base64 في مثل المشاعات الترميز أو استخدام الترميز التي تأتي مع BouncyCastle

import java.io.IOException;
import java.security.GeneralSecurityException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;

public class Encryption {

    private static SecretKey sharedkey;
    private static byte [] sharedvector;

    static {
        int keySize = 168;
        int ivSize = 8;
        try {
            KeyGenerator keyGenerator = KeyGenerator.getInstance("DESede");
            keyGenerator.init(keySize);
            sharedkey = keyGenerator.generateKey();

            sharedvector = new byte [ivSize];
            byte [] data = sharedkey.getEncoded();

            int half = ivSize / 2;
            System.arraycopy(data, data.length-half, sharedvector, 0, half);
            System.arraycopy(sharedvector, 0, sharedvector, half, half);
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

    public static void main(String [] args) throws Exception {
        System.out.println(Decrypt(Encrypt("Hello World")));

    }

    public static String Encrypt(String val) throws GeneralSecurityException {
        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, sharedkey, new IvParameterSpec(sharedvector));

        return new sun.misc.BASE64Encoder().encode(cipher.doFinal(val.getBytes()));
    }

    public static String Decrypt(String val) throws GeneralSecurityException, IOException {
        Cipher cipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        cipher.init(Cipher.DECRYPT_MODE, sharedkey, new IvParameterSpec(sharedvector));

        return new String(cipher.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(val)));
    }

}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top