• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

ahmed.o.mohamed

المشرفين القدامى
  • عدد المشاركات

    1,864
  • تاريخ الانضمام

  • تاريخ اخر زياره

السمعه بالموقع

931 ممتاز جدا

4 متابعين

عن ahmed.o.mohamed

  • الرتبة
    مشرف سابق لقسم السى و السى++
  • تاريخ الميلاد 01/02/1992

طرق الإتصال

معلومات الملف الشخصي

  • الجنس ذكر
  • الدولة : موريتانيا
  • اهتمامات الأدب ، الذكاء الاصطناعي ، البرمجة و حماية الأنظمة.

أحدث الزائرين لملفلك الشخصي

31,116 زياره للملف الشخصي
  1. هل يمكن فك خوارزميات التشفير ؟

     أخي الفاضل ، رسالة تخرجي في الماستر قبل سنتين من الآن كانت تتحدث عن كيفية تشفير و حماية بيانات الموظفين في شركة معينة وكنتُ قد استخدمت فيها encryption, hashing و الـ encoding. لذا أعي جيداً ما أتحدث عنه ولستُ بجديد في هذا المجال. ما أود تأكيده هو أنه في علم التعمية ، لا توجد خوارزمية تشفير أو دالة هاش لا يُمكن كسرها. ما يصنع الفرق فقط هو الوقت المُستغرق لكسر الخوارزمية أو الدالة. خوارزميات التشفير يُمكن كسرها باستخدام الـ Brute Force لكن الوقت المُستغرق قد يكون هائلا جداً. و دوال الهاش أيضا يُمكن كسرها عن طريق إيجاد تصادم. لذا لا أفضل استخدام كلمة مستحيل في مثل هذه العلوم ، شخصياً ، أفضل العبارات "صعب جداً" أو "يأخذ وقتاً هائلا" أو ما شابه. في الأخير ، لا تأخذ الملاحظات على أنها طعن في أقوالك أو تأييد لغيرك و إنما هي وجهة نظر لما كتبتَ و لا علاقة لها بشيء آخر.   طابت أوقاتكم.
  2. طلب مساعدة حول تعلم لغة السي

    ذاك كتاب جيد، أرجو لك التوفيق.  
  3. هل يمكن فك خوارزميات التشفير ؟

    في عالم التشفير ، لا توجد كلمة مُستحيل :)
  4. طلب مساعدة حول تعلم لغة السي

    السلام عليكم   أخي الكريم علي عبد الهادي ، سألخص لك وجهة نظري في نقطتين : إذا كنت تود دراسة المفاهيم المتقدمة في السي فعليك بالمراجع الأجنبية ، المراجع العربية الموجودة الآن تُغطي بالمُجمل أساسيات اللغة. إن كنت تدرس السي كهواية وليس كمادة في الجامعة فأنصحك (عن تجربة) بالتخلي عنها و تعلم لغة برمجة أخرى أكثر لك نفعا مثل Pyhton, Java, C#, PHP. طابت أوقاتك.  
  5. برنامج ترتيب الملفات

    السلام عليكم   فكرة البرنامج جيدة لكن توجد برامج عديدة تقوم بهذا العمل لذا إن كنتَ كتبتَ البرنامج لغرض تعليمي فلا حرج عليك أما إن كنت تود منافسة البرامج الموجودة في السوق فيجب عليك إضافة خيارات جديدة غير موجودة في البرامج المنافسة حتى تضمن التميز.   إليك ملاحظاتي عن البرنامج بشكل سريع : الـ progressbar يجب أن يتقدم حسب نسبة العمل المُنجز و هذا ما لم تفعله.حاول أن تضع خيار للنسخ و آخر للنقل بدل النقل فقط ثم فكر في وضع زر لتوقيف العملية و آخر لإلغائها (pause, cancel)يُفضل أن تضع JLabel بالأسفل تُظهر فيه الملف الذي يتم نقله الآن حتى يكون المُستخدم على علم بتفاصيل العملية لأن المستخدم إذا قام مثلا بنقل 100 ملف و أخذ الأمر 5 دقائق و لم يُظهر له البرنامج، لا نسبة تقدم العملية و لا اسم الملف المُعالج سيظن أن البرنامج لا يعمل بشكل صحيح !احذر من تقييد الامتدادات، مثلا برنامجك لا يستطيع نقل ملفات VOB ! حاول أن تأخذ بعين الاعتبار وجود امتدادات معينة لم تكن على علم بها أثناء كتابتك الكودرسائل الخطأ فضفاضة جداً، حاول وضع رسائل يستطيع المستخدم أن يفهم من خلالها طبيعة الخطأعند الضغط على "تصفح" يجب أن تسمح باختيار المجلدات فقطإن تركت الـ  jtextfields تبع التصفح enabled يجب أن عليك أن تأخذ بعين الإعتبار مجموعة الـ exceptions المحتلملة (مثلا، إذا أدخل المستخدم مساراً غير صحيح ستحصل على استثناء من نوع NullPointerException)أعتقد أنه عند تحديد مسار صحيح، من المنطقي جداً نقل الملفات الموجودة في الـ subfolders (هل فكرتَ في الأمر ؟)تعاملك مع الـ CheckBoxs و الامتدادات لم يكن جيدا، ما دمتَ تنوي التعامل مع عدد كبير من كائنات من نفس النوع فيُستحسن وضعها داخل ArrayList أو HashMap مثلا و الوصول للكائنات عن طريق الـ index أو الـ value إن أردت.في الكلاس acListener قمت بالإعلان عن المتغيرات calendar, Second, Second1, minute1, minute لكن لم تستخدمها !مبدأ الـ OOP أتى أساساً للتخلص من التعامل مع متغيرات فئة في فئة أخرى (استخدام الـ public يجب أن يكون محدوداً جداً و لا يُنصح به)قمتَ بالتعامل مع متغيرات الكلاس FilesSort داخل الكلاس acListener، كان يجب عليك أن تستخدم الـ observer pattern إن كنتَ ملزما بهذا مع أنني أرى أن إضافة الـ actionListener ليست سبباً لإنشاء كلاس جديد ! (لو استخدمت ArrayList ووضعتَ فيه الـ checkBox ستجد أن الكود تقلص بشكل كبير)المنطقي هو أن ترث الفئة FilesSort بشكل مباشر JFrame، وجود متغير داخل الفئة اسمه frame يُمثل النافذة يعني أن FilesSort ليست نافذة و إنما هي كائن يحوي مجموعة كائنات من بينهم نافذة !أشجعك جداً على استخدام الكود لرسم الواجهة.setLayout(null)l لا أنصح بها، كان من الأفضل أن تكتب LayoutManager خاص بك ثم تقوم باستخدامه لتحديد تموضع كل مُكون مع أنني أرى أن استخدام الـ Layouts الموجودة مُسبقاً يكفيك.من ناحية جودة الكود و جعل تطوير البرنامج أكثر سلاسة، قم بفصل المكونات الثلاث : model, view, controller.إذا قام المستخدم بنقل ملفات ذات حجم كبير، سيتعطل الـ thread تبع الـ EDT، من الأفضل أن تضع كود نقل الملفات في thread منفصل.    بالتوفيق.
  6. قريبا سيتم إطلاق الإصدار الأول من JProtector

    صحيح، لذا تكلمتُ عن مستوى درجة الحماية التي يُقدمها البرنامج في فقرة النصائح في الـ menubar.
  7. قريبا سيتم إطلاق الإصدار الأول من JProtector

      من سييتخدم مجموعة supercomputer لكسر ملف psm لشخص عادي جداً ؟ لا أتوقع مثلا أن يتم استخدام botnet روسي لعمل brute-force لملف الـ psm، لأن كسره لن يعني لهم الكثير :)
  8. قريبا سيتم إطلاق الإصدار الأول من JProtector

      غير آمنة ! متأكد من ذلك ؟   @vector_ever راسلني على الخاص، إن تمت أمورك بشكل كامل.
  9. قريبا سيتم إطلاق الإصدار الأول من JProtector

    أوكي. هل أنت مستعد للمشاركة ؟ و بأي لغة برمجة تود كتابة نسخة الويب ؟
  10. قريبا سيتم إطلاق الإصدار الأول من JProtector

    أهلا vector ever :)   هل تقصد بالـ entreprise وجود التطبيق على server و إمكانية الوصول إلى قاعدة بيانات المستخدم عن بعد ؟ (للعلم، مع تعديلات خفيفة، يُمكن للبرنامج الآن أن يعمل هكذا) أم تقصد وجود shared database تحوي مجموعة كلمات سر لمجموعة مستخدمين مع تسيير الـ privileges لكل مسستخدم ؟ (هذا يتطلب إعادة النظر في الـ architecture تبع التطبيق)   الـ architecture الحالية هكذا :    
  11. قريبا سيتم إطلاق الإصدار الأول من JProtector

    بلا اقتحام بلا بطيخ :P :D حسب فكرتي، الهاش يتم توليده بـ SHA-256 و يتم تشفيره بـ AES-CBC-256 و مفتاح التشفير هو نفسه المفتاح الذي أشفر به بيانات الحسابات.
  12. قريبا سيتم إطلاق الإصدار الأول من JProtector

    @أحمد أبو عبد البر حفظ قاعدة البيانات من العبث صعيب جداً إن كان التطبيق portable لكن لو كان التطبيق مُثبتا على الجهاز فيُمكن تخزين الـ hash في أحد ملفات الـ installation التابعة للتطبيق. الفكرة التي أعمل عليها حالياً لضمان الـ integrity تكمن في حساب hash الملف و تخزينه مُشفراً في قاعدة البيانات، عند محاولة فتح الملف أقوم بحساب الهاش الجديد للملف ثم أقارنه بالهاش المُخزن بعد فك تشفيره. ما رأيك ؟ :)   @vector_ever في الحقيقة لم أفكر في هذا، البرنامج كتبته بالأساس للإستعمال الشخصي، لكن ربما أغير فكرتي إن وجدتُ عرضاً من شركة ما، من يدري ؟ :D الإصدار القادم سيدعم : العمل على عدة work session في نفس الوقتتحسين عملية البحث عن الحسابات باستخدام الـ regexجعل التطبيق على شكل plugin (سأبدأ  بـ firefox و بعدها سأفكر في chrome و البقية تأتي ..)برمجة نسخة للهواتف الذكية (سأبدأ بالعمل على نسخة الـ Android و بعدها Windows Phone)  تحياتي.
  13. قريبا سيتم إطلاق الإصدار الأول من JProtector

    صور أخرى :)       هذه هي الـ fonctionnalité الوحيدة المتبقية، أعمل الآن عليها :rolleyes:
  14. السلام عليكم   أعمل الآن على وضع اللمسات الأخيرة لبرنامج صغير (Password Manager) يسمح بتسيير و حفظ كلمات المرور بشكل آمن مع ضمان الـ portability.   وظائف البرنامج : إنشاء قاعدة بيانات جديدة (قاعدة البيانات محمية بالـ master password) (إضافة، تغيير، حذف، بحث [عن] ) حساب نسخ المعرف أو كلمة المرور تنضيف الـ cliboard فتح الـ URL تبع الحساب (إن وُجد) توليد كلمات مرور قوية تقييم صلابة كلمات المرور إظهار تفاصيل التقييم حفظ قاعدة البيانات باسم (save as) - امتداد الملف الذي استخدمته هو psm تغيير كلمة المرور الرئيسية تسجيل الخروج بشكل يدوي تسجيل الخروج بشكل تلقائي (بعد مدة مُحددة) فتح ملف الـ psm توليد كلمة المرور انطلاقا من تحريك الـ mouse على random picture لمدة 10 ثواني إظهار الحسابات المنتهية الصلاحية حماية ملف الـ psm ضد التعديل .  المكتبات المُستخدمة : Boucny CaslteSQLite JDBCSwingXJTattoo  الـ design patterns المُستخدمة : Model–View–ControllerObserver Pattern  الـ IDE المُستخدم : Netbeans. لم أستخدم Drag and Drop لرسم الواجهات، كتبتها جميعاً عن طريق الكود :   صور من البرنامج :     إن كان هناك من يرغب في الحصول على السورس كود لتطوير البرنامج فليراسلني على الخاص. (للجادين فقط :) )     تحياتي.
  15. Generator example 01

    و عليكم السلام و رحمة الله   أعجبتني فكرة التمرين ! :rolleyes:   هذه محاولتي : import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.ArrayList;import java.util.Random;import javax.swing.*;/** * * @author Snack3r */public class GeneratorDemo extends JDialog implements ActionListener { private Container container; private JPanel topPanel, centerPanel, bottomPanel, view; private JTextField valueNumbers; private JButton generate, random, calcul; private JLabel result; private JScrollPane scroller; private ArrayList<JTextField> list; private int number; public void init() { valueNumbers = new JTextField(); valueNumbers.setPreferredSize(new Dimension(100, 27)); generate = new JButton("Generate"); generate.addActionListener(this); topPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 30, 10)); topPanel.add(new JLabel("No. of values")); topPanel.add(valueNumbers); topPanel.add(generate); centerPanel = new JPanel(); centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); scroller = new JScrollPane(centerPanel); scroller.setPreferredSize(new Dimension(300, 210)); view = ((JPanel) scroller.getViewport().getView()); random = new JButton("Random"); random.addActionListener(this); calcul = new JButton("Total"); calcul.addActionListener(this); result = new JLabel("Total value : "); bottomPanel = new JPanel(new FlowLayout(FlowLayout.CENTER, 70, 10)); bottomPanel.add(random); bottomPanel.add(calcul); bottomPanel.add(result); container = this.getContentPane(); container.setLayout(new BorderLayout()); container.add(topPanel, BorderLayout.NORTH); container.add(scroller, BorderLayout.CENTER); container.add(bottomPanel, BorderLayout.SOUTH); pack(); } private void addNewField() { JTextField newField = new JTextField(); newField.setPreferredSize(new Dimension(100, 27)); newField.setAlignmentX(Component.CENTER_ALIGNMENT); list.add(newField); view.add(newField); view.validate(); } private boolean isListFieldsNotEmpty() { for (int i = 0; i < list.size(); i++) { if (list.get(i).getText().isEmpty()) { return false; } } return true; } @Override public void actionPerformed(ActionEvent e) { if (e.getSource() == generate) { try { number = Integer.parseInt(valueNumbers.getText()); if (number <= 0) { JOptionPane.showMessageDialog(null, "Avertissement, la valeur doit être strictement positive !", "Valeur invalide", JOptionPane.WARNING_MESSAGE, null); view.removeAll(); return; } } catch (NumberFormatException ex) { JOptionPane.showMessageDialog(null, "Erreur, veuillez saisir un entier !", "Valeur incorrecte", JOptionPane.ERROR_MESSAGE, null); view.removeAll(); return; } if (view != null) { view.removeAll(); } list = new ArrayList<>(); for (int i = 1; i <= number; i++) { addNewField(); } view.revalidate(); view.repaint(); } if (e.getSource() == random) { if (list == null) { JOptionPane.showMessageDialog(null, "Erreur, veuillez tout d'abord générer des champs !", "Champs requis non générés", JOptionPane.ERROR_MESSAGE, null); return; } Random src = new Random(System.currentTimeMillis()); for (int i = 0; i < list.size(); i++) { list.get(i).setText(Integer.toString(src.nextInt(100))); } } if (e.getSource() == calcul) { if (list == null) { JOptionPane.showMessageDialog(null, "Erreur, veuillez tout d'abord générer des champs !", "Champs requis non générés", JOptionPane.ERROR_MESSAGE, null); return; } if (isListFieldsNotEmpty()) { long sum = 0L; for (int i = 0; i < list.size(); i++) { sum += Long.parseLong(list.get(i).getText()); } result.setText("Total value : " + Long.toString(sum)); } else { JOptionPane.showMessageDialog(null, "Avertissement, veuillez remplir tous les champs !", "Champs requis vides", JOptionPane.WARNING_MESSAGE, null); } } } public static void main(String ...args) { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex1) { JOptionPane.showMessageDialog(null, "Erreur, Impossible de charger le Look And Feel du système", "Chargement échoué", JOptionPane.ERROR_MESSAGE, null); } GeneratorDemo gd = new GeneratorDemo(); gd.setTitle("Snack3r's Generator"); gd.init(); gd.setLocationRelativeTo(gd); gd.setDefaultCloseOperation(DISPOSE_ON_CLOSE); gd.setVisible(true); }}صورة من واجهة البرنامج :     بانتظار مشاركات بقية الإخوة.