• 0
Muhammed Magdy

مشكلة في مثال تشفير

سؤال

هذا مثال لتشفير و فك تشفير نص بسيط شرح المثال:  كلمة ِahmed يشفرها ل aehdm. ، يضيف نقطة إذا كان طول النص لا يقبل القسمة على 2 ، وعند الضغط على فك تشفير المفروض يرجعها كما كانت ، المشكلة إن لا يوجد خطأ في الأكواد و يعطيني Exception

import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;/** * * @author Muhammed_Pro */public class Encryption extends JFrame {        JTextField t1, t2,t3;    JButton b1,b2;        public Encryption() {        setLayout(new FlowLayout());        t1 = new JTextField(10);        t2 = new JTextField(10);        b1 = new JButton("تشفير");        b2 = new JButton("فك التشفير");        b1.addActionListener(new ActionListener() {                        @Override            public void actionPerformed(ActionEvent e) {                String txt = t1.getText();                if (txt.length() % 2 != 0) {                    txt += ".";                    int m = txt.length() / 2;                    String P1 = txt.substring(0, m);                    String P2 = txt.substring(m);                    String code = "";                    for (int i = 0; i < m; i++) {                        code = code + P1.charAt(i) + P2.charAt(i);                        t2.setText(code);                    }                }            }        });                b2.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                String s = t2.getText();                String d1 = "";                String d2 = "";                for (int i=1; i < s.length();i+=2){                    d2 = d2 + s.charAt(i);                    t3.setText(d1+d2);                }                for (int i=1; i < s.length();i+=2){                    d2 = d2 + s.charAt(i);                    t3.setText(d1+d2);                }            }        });                add(t1);        add(t2);        add(t3);        add(b1);        add(b2);                setVisible(true);        setSize(100, 200);        setLocationRelativeTo(null);        setDefaultCloseOperation(EXIT_ON_CLOSE);    }    }
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

14 إجابة على هذا السؤال .

  • 0

يبدو أنك نسيت :

 t3 = new JTextField(10);

ضعه في الـ Constructor

 

ملاحظة :

الكود يشفر بطريقتك ولكن لا يعيد الكلمة لأصلها , أيضًا الكود لايشفر إلا النص الذي طوله عدد مفرد ، فأنت تحتاج بعض العمل لحل هذه المشاكل ...

تم تعديل بواسطه هدف الشمالي
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

يبدو أنك نسيت :

 t3 = new JTextField(10);

ضعه في الـ Constructor

 

ملاحظة :

الكود يشفر بطريقتك ولكن لا يعيد الكلمة لأصلها , أيضًا الكود لايشفر إلا النص الذي طوله عدد مفرد ، فأنت تحتاج بعض العمل لحل هذه المشاكل ...

 

فعلاً المكشلة كانت في تعريف ال JTextField و حليت مشكلة إرجاع النص كما كان ، الأن المشكلة إنه لا يشفر العدد الزوجي بالرغم من إني كاتب الشرط صحيح !

 

الأكواد بعد التعديل

import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.JButton;import javax.swing.JFrame;import javax.swing.JTextField;public class Encryption extends JFrame {        JTextField t1, t2, t3;    JButton b1, b2;        public Encryption() {        setLayout(new FlowLayout());        t1 = new JTextField(10);        t2 = new JTextField(10);        t3 = new JTextField(10);        b1 = new JButton("تشفير");        b2 = new JButton("فك التشفير");        b1.addActionListener(new ActionListener() {                        @Override            public void actionPerformed(ActionEvent e) {                String txt = t1.getText();                if (txt.length() % 2 != 0) {                    txt += ".";                    int m = txt.length() / 2;                    String P1 = txt.substring(0, m);                    String P2 = txt.substring(m);                    String code = "";                    for (int i = 0; i < m; i++) {                        code = code + P1.charAt(i) + P2.charAt(i);                        t2.setText(code);                    }                }            }        });                b2.addActionListener(new ActionListener() {                        @Override            public void actionPerformed(ActionEvent ae) {                String s = t2.getText();                String d1 = "";                String d2 = "";                for (int i = 0; i < s.length(); i += 2) {                    d1 = d1 + s.charAt(i);                }                for (int i = 1; i < s.length(); i += 2) {                    d2 = d2 + s.charAt(i);                    t3.setText(d1 + d2);                    String a = t3.getText();                    if (a.endsWith(".")) {                        t3.setText(a.substring(0, a.length() - 1));                    }                }            }        });                add(t1);        add(t2);        add(t3);        add(b1);        add(b2);                setVisible(true);        setSize(100, 200);        setLocationRelativeTo(null);        setDefaultCloseOperation(EXIT_ON_CLOSE);    }    }
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

أخي الكريم، هذا ليس تشفيراً !!

أنصحك بالآتي :

  1. استخدم PBKDF2 لتوليد مفتاح التشفير انطلاقا من كلمة المرور. (اختر HMAC لحساب الـ hash)
  2. قم بتشفير النص بمفتاح التشفير السابق.

للتحقق من كلمة المرور (ahmed مثلا) :

  1. قم بتوليد مفتاح التشفير المقابل لكلمة المرور المُدخلة.
  2. حاول فك تشفير النص بمفتاح التشفير السابق، إذا كانت كلمة المرور خاطئة ستحصل على Exception من نوع InvalideKeyException و إلا ستحصل على النص الأصلي بعد فك التشفير.

 

هذه الطريقة تضمن لك مستوى عالي من الـ security.

بالتوفيق.

تم تعديل بواسطه Snack3r
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

في حدث b1 أنت تقول إذا كان عدد حروف النص مفرد إفعل كذا ، ونسيت إن كان النص غير مفرد ، وهذا الحل :

  b1.addActionListener(new ActionListener() {                        @Override            public void actionPerformed(ActionEvent e) {                String txt = t1.getText();                if (txt.length() % 2 != 0) {                    txt += ".";                    }                    int m = txt.length() / 2;                    String P1 = txt.substring(0, m);                    String P2 = txt.substring(m);                    String code = "";                    for (int i = 0; i < m; i++) {                        code = code + P1.charAt(i) + P2.charAt(i);                        t2.setText(code);                    }                            }        });

ومثل ماقال لك الأخ Snack3r هناك خوارزميات تشفير مثل Sha-256 و غيرها إن كنت تريد عمل حقيقي فعليك تعلم استخدامها ، ولكن إن كان كودك من باب المتعة والتدريب وليس التطبيق العملي فلا بأس ...

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

في حدث b1 أنت تقول إذا كان عدد حروف النص مفرد إفعل كذا ، ونسيت إن كان النص غير مفرد ، وهذا الحل :

  b1.addActionListener(new ActionListener() {                        @Override            public void actionPerformed(ActionEvent e) {                String txt = t1.getText();                if (txt.length() % 2 != 0) {                    txt += ".";                    }                    int m = txt.length() / 2;                    String P1 = txt.substring(0, m);                    String P2 = txt.substring(m);                    String code = "";                    for (int i = 0; i < m; i++) {                        code = code + P1.charAt(i) + P2.charAt(i);                        t2.setText(code);                    }                            }        });

ومثل ماقال لك الأخ Snack3r هناك خوارزميات تشفير مثل Sha-256 و غيرها إن كنت تريد عمل حقيقي فعليك تعلم استخدامها ، ولكن إن كان كودك من باب المتعة والتدريب وليس التطبيق العملي فلا بأس ...

شكراً لكم المثال للتدريب على الدوال الجاهزة وليس للتشفير بمعناه الحقيقي :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

هناك خوارزميات تشفير مثل Sha-256

 

sha-256 عبارة عن  hash function و ليست خوارزمية تشفير :)

التشفير هو عملية عكسية يتم من خلالها تحويل نص مُعين إلى نص آخر غير مفهوم و يُمكن الحصول على النص الأصلي عند فك التشفير أما الـ hash فهو من نوع one-way function و بالتالي لا يُمكن الحصول على النص انطلاقا من الـ hash تبعه.

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

sha-256 عبارة عن  hash function و ليست خوارزمية تشفير :)

التشفير هو عملية عكسية يتم من خلالها تحويل نص مُعين إلى نص آخر غير مفهوم و يُمكن الحصول على النص الأصلي عند فك التشفير أما الـ hash فهو من نوع one-way function و بالتالي لا يُمكن الحصول على النص انطلاقا من الـ hash تبعه.

طيب بإعتبار إن خورازمية التشفير أقوى من الهاش ، ممكن تضيفلي على المثال السابق تشفير النص المدخل أو أعطيني مثال من عندك :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 

بإعتبار إن خورازمية التشفير أقوى من الهاش

لم أقل أنها أقوى ! كل واحد منهما له استخداماته الخاصة.

 

 

ممكن تضيفلي على المثال السابق تشفير النص المدخل أو أعطيني مثال من عندك

الكود التالي عبارة عن تطبيق للفكرة التي قلت لك آنفاً :

import java.io.PrintWriter;import java.io.StringWriter;import java.io.Writer;import java.security.InvalidAlgorithmParameterException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.security.spec.InvalidKeySpecException;import java.util.Arrays;import java.util.Scanner;import javax.crypto.*;import javax.crypto.spec.IvParameterSpec;import javax.crypto.spec.PBEKeySpec;import javax.crypto.spec.SecretKeySpec;public class TextEncryption {    private char[] masterPassword;    private int lengthDerivedKey, iterationCount;    private byte[] salt;    private IvParameterSpec iv;    {        lengthDerivedKey = 256;        iterationCount = 2000;        salt = "Salt".getBytes();        iv = new IvParameterSpec("C8BF3A75D364E8BF".getBytes());    }    public void setMasterPassword(char[] mp) {        masterPassword = Arrays.copyOf(mp, mp.length);    }    private SecretKey generateEncryptionKey(char[] password) throws NoSuchAlgorithmException, InvalidKeySpecException {        PBEKeySpec pbeSpec = new PBEKeySpec(password, salt, iterationCount, lengthDerivedKey);        SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1");        SecretKey tmp = skf.generateSecret(pbeSpec);        return new SecretKeySpec(tmp.getEncoded(), "AES");    }    private SecretKey getEncryptionKey() throws NoSuchAlgorithmException, InvalidKeySpecException {        return generateEncryptionKey(masterPassword);    }    private byte[] encrypt(byte[] message, SecretKey encryptionKey) throws NoSuchAlgorithmException,            NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,            BadPaddingException, InvalidAlgorithmParameterException {        Cipher cipherEncryptMode = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipherEncryptMode.init(Cipher.ENCRYPT_MODE, encryptionKey, iv);        return cipherEncryptMode.doFinal(message);    }    private byte[] decrypt(byte[] message, SecretKey encryptionKey) throws NoSuchAlgorithmException,            NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,            BadPaddingException, InvalidAlgorithmParameterException {        Cipher cipherDecryptMode = Cipher.getInstance("AES/CBC/PKCS5Padding");        cipherDecryptMode.init(Cipher.DECRYPT_MODE, encryptionKey, iv);        return cipherDecryptMode.doFinal(message);    }    public void printException(Exception ex) {        Writer writer = new StringWriter();        PrintWriter printWriter = new PrintWriter(writer);        ex.printStackTrace(printWriter);        String printException = writer.toString();        System.out.println(printException);    }    public static void main(String... args) {        String text = "KDFs are deterministic algorithms that are used to derive cryptographic "                + "keying material from a secret value, such as a password.";        Scanner scanner = new Scanner(System.in);        System.out.print("Enter a master password : ");        String buffer = scanner.nextLine();        TextEncryption te = new TextEncryption();        te.setMasterPassword(buffer.toCharArray());        try {            SecretKey key = te.getEncryptionKey();            byte[] encrypt = te.encrypt(text.getBytes(), key);            System.out.println("Encrypted text : " + new String(encrypt));            String decrypt = new String(te.decrypt(encrypt, key));            System.out.println("Decrypted text : " + decrypt);        } catch (InvalidKeySpecException | NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException |                IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException ex) {            te.printException(ex);        }    }}

و هذا مثال على مخرجات الكود :

post-219439-0-42658900-1414948245_thumb.

تم تعديل بواسطه Snack3r
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

sha-256 عبارة عن  hash function و ليست خوارزمية تشفير :)

التشفير هو عملية عكسية يتم من خلالها تحويل نص مُعين إلى نص آخر غير مفهوم و يُمكن الحصول على النص الأصلي عند فك التشفير أما الـ hash فهو من نوع one-way function و بالتالي لا يُمكن الحصول على النص انطلاقا من الـ hash تبعه.

 

لماذا لاتسمى خوارزمية تشفير ؟

أنا ما أتيت بشيء من عندي ، بإمكانك الإطلاع على الموسوعة العالمية الحرة من هنا :

http://en.wikipedia.org/wiki/SHA-2

ومن هنا :

http://en.wikipedia.org/wiki/SHA-3

 

وإذا كنت سمعت بالبتكوين فهي مشفرة بـ sha-256 المضاعفة ، وإليك مدونة أحد موظفي قوقل والذي يتحدث عن أن sha-256 خوارمية تشفير وأن البتكوين مشفرة بها :

 

http://www.righto.com/2014/02/bitcoin-mining-hard-way-algorithms.html

تم تعديل بواسطه هدف الشمالي
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

لماذا لاتسمى خوارزمية تشفير ؟

 

 

لأن خوارزمية التشفير تقوم بإخفاء المعلومات باستخدام مفتاح سري وخوارزمية, حيث يمكن للشخص الذي يعرف المفتاح و خوارزمية التشفير, فك الشفرة (أي استعادة المعلومات الأصلية).

لذا قلت لك أن دالة الهاش ليست خوارزمية تشفير.

 

 

أنا ما أتيت بشيء من عندي ، بإمكانك الإطلاع على الموسوعة العالمية الحرة

 

الـ cryptographic hash functions بالتعريف هي :

 

A cryptographic hash function is a hash function which is considered practically impossible to invert, that is, to recreate the input data from its hash value alone. These one-way hash functions have been called "the workhorses of modern cryptography"l

 

أما الـ encryption فهو :

 

encryption is the process of encoding messages or information in such a way that only authorized parties can read it. Encryption does not of itself prevent interception, but denies the message content to the interceptor.In an encryption scheme, the message or information, referred to as plaintext, is encrypted using an encryption algorithm, generating ciphertext that can only be read if decrypted. For technical reasons, an encryption scheme usually uses a pseudo-random encryption key generated by an algorithm

 

الـ Cryptography بالتعريف هو عملية تحويل البيانات من شكلها الطبيعي المفهوم إلى شكل غير مفهوم و هذا الشرط يُحققه كل من الـ Encryption و الـ Hash لكن تبقى المصطلحات الثلاثة مُختلفة :

  1. علم التعمية (Cryptography) : تحويل البيانات من شكلها الطبيعي المفهوم إلى شكل غير مفهوم بغض النظر عن قابلية استرجاع المعلومات بعد تحويلها.
  2. خوارزمية تشفير (encryption algorithm) : إخفاء المعلومات باستخدام مفتاح سري و خوارزمية, حيث يمكن للشخص الذي يعرف المفتاح و خوارزمية التشفير, فك الشفرة.
  3. دالة هاش (hash function) : تحويل البيانات إلى شكل غير مفهوم و لا يُمكن الرجوع إلى النص الأصلي انطلاقا من الـ hash.

 

 

بالتوفيق.

تم تعديل بواسطه Snack3r
1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ملاحظة :

لتشغيل الكود السابق يجب عليك تثبيت الـ Bouncy Castle Provider :

How to use Bouncy Castle Cryptographic API in NetBeans or Eclipse for Java JSE projects

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

ملاحظة :

لتشغيل الكود السابق يجب عليك تثبيت الـ Bouncy Castle Provider :

How to use Bouncy Castle Cryptographic API in NetBeans or Eclipse for Java JSE projects

إتبعت نفس التعليمات و لم تنجح العملية ، لكني وجدت إصدار مختلف من المكتبة غير اللي بالشرح و هو bcprov-jdk15on-151.jar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

 

إتبعت نفس التعليمات و لم تنجح العملية

لماذا لم تنجح ؟ ما طبيعة الخطأ الذي حصلت عليه ؟

 

أعتقد أنه سيكون من الأسرع لو ساعدتك في الـ real-time، يُمكن أن نتقابل في skype إن أردت.

راسلني على الخاص.

تم تعديل بواسطه Snack3r
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
  • 0

تم حل المشكلة ، المكتبة تعمل على الإصدار Java SE 7u71/72 جيداً :)


0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

من فضلك سجل دخول لتتمكن من التعليق

ستتمكن من اضافه تعليقات بعد التسجيل



سجل دخولك الان

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .