Son zamanlarda ismi sıkça anılan meşhur ByLock uygulamasını incelemek istedim.

Projemizi netbeans’ın son sürümü ile gerçekleştirelim.

Bunun için öncelikle meşhur java IDE’si NetBeans’ı https://netbeans.org/ adresinden indirip bilgisayarımıza kuralım. Bilgisayarınızda Jdk ve JavaRuntimeEnviroment kurulu olduğunu varsayıyorum.

NetBeans’ı açalım ve New Project diyerek Java Desktop Application diyelim. Projemizin adını SimpleBylockServer olarak verelim. Projemize 1 Adet Buton, 1 Adet JTextArea, 1 Adet JTextField, 1 Adet label ekleyelim ve aşağıdaki kodları uygun yerlere kopyalayıp yapıştıralım.

Server’imizin (SUNUCU) kodları aşağıdadır.

import com.sifre.MD5Sifreleme;

import java.io.*;

import java.net.*;

public class sunucu extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

private ObjectOutputStream yazici;

private ObjectInputStream okuyucu;

private ServerSocket serverSocket;

private Socket baglantiSoketi;

private final int portNo;

public sunucu() {

initComponents();

portNo = 8890;

}

public void serveriBaslat() {

try {

serverSocket = new ServerSocket(portNo, 100);

while (true) {

baglantiyiBekle();

veriOkuYaz();

baglantiyiBaslat();

baglantiyiKapat();

}

} catch (IOException ex) {

}

}

public void baglantiyiBekle() {

jTextArea1.append("\n istemci bekleniyor...");

try {

baglantiSoketi = serverSocket.accept();

jTextArea1.append("\n İstemci ile Bağlantı Sağlandı.");

jButton1.setEnabled(true);

} catch (IOException ex) {

}

}

public void veriOkuYaz() {

try {

yazici = new ObjectOutputStream(baglantiSoketi.getOutputStream());

yazici.flush();

okuyucu = new ObjectInputStream(baglantiSoketi.getInputStream());

} catch (IOException ex) {

}

}

public void baglantiyiBaslat() {

try {

String message = "SUNUCU MESAJI>>> Bağlantı Başarıyla Gerçekleşti...";

yazici.writeObject(message);

yazici.flush();

jTextField1.setEnabled(true);

do {

message = (String) okuyucu.readObject();

jTextArea1.append("\n" + message);

jTextArea1.setCaretPosition(jTextArea1.getText().length());

} while (!message.equals("CLIENT>>> TERMINATE"));

} catch (IOException | ClassNotFoundException ex) {

}

}

private void baglantiyiKapat() {

try {

jTextArea1.append("\nBağlantı Kapatıldı.");

jTextField1.setEnabled(false);

yazici.close();

okuyucu.close();

baglantiSoketi.close();

jButton1.setEnabled(false);

} catch (IOException ex) {

}

}

private void veriGonder(String mesaj) {

try {

yazici.writeObject("SUNUCU>>> " + mesaj);

yazici.flush();

jTextArea1.append("\nSUNUCU>>> " + mesaj);

} catch (IOException ex) {

}

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

jTextArea1 = new javax.swing.JTextArea();

jTextField1 = new javax.swing.JTextField();

jButton1 = new javax.swing.JButton();

jLabel4 = new javax.swing.JLabel();

jMenuBar1 = new javax.swing.JMenuBar();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setTitle("Simple_BYLOCK_Sunucu");

setBackground(new java.awt.Color(51, 51, 51));

setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

setLocationByPlatform(true);

setPreferredSize(new java.awt.Dimension(378, 367));

jTextArea1.setColumns(20);

jTextArea1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jTextArea1.setRows(5);

jTextArea1.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));

jScrollPane1.setViewportView(jTextArea1);

jTextField1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jTextField1.setHorizontalAlignment(javax.swing.JTextField.LEFT);

jTextField1.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));

jTextField1.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));

jButton1.setText("Gönder");

jButton1.setEnabled(false);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

jLabel4.setIcon(new javax.swing.ImageIcon("C:\\Users\\win7\\Documents\\NetBeansProjects\\SimpleBylockSunucu\\image\\kilit.jpg")); // NOI18N

setJMenuBar(jMenuBar1);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane1)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jTextField1)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 90, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 249, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(0, 82, Short.MAX_VALUE)))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addGap(6, 6, 6)

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 152, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 110, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))

.addContainerGap(19, Short.MAX_VALUE))

);

pack();

}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

// MD5Sifreleme sınıfından bir nesne oluşturuyoruz

MD5Sifreleme m5Sifreleme = new MD5Sifreleme();

// Verileri şifreleyen metot burada çağırılıyor.

String sifreliVeri = m5Sifreleme.md5Sifrele(jTextField1.getText());

// Şifrelenmiş veriyi gönderdik.

veriGonder(sifreliVeri);

jTextField1.setText("");

}

public static void main(String args[]) {

sunucu snc = new sunucu();

snc.setVisible(true);

snc.serveriBaslat();

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel4;

private javax.swing.JMenuBar jMenuBar1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JTextArea jTextArea1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

Tabii verilerimizi şifreli olarak göndereceğiz. Bunun içinde bir adet class yazıp verilerimizi java security kütüphanesini kullanarak MD5 ile şifreleyip onden sonra göndereceğiz. Artık aramızda ne konuştuğumuzu kimse anlayamaz.

İşte ByLock’un can alıcı noktasıda burasıdır.

Gerisi bildiğiniz sıradan bir ağ programlama mantığı. Hani şu Efsane Messenger gibi.

Şimdide MD5Sifreleme isimli bir class oluşturalım. Aşağıdaki kodları kopyalayıp uygun yere yapıştıralım.

//MD5Sifreleme.java

package com.sifre;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

public class MD5Sifreleme {

public String md5Sifrele(String metin) {

String sifrelenecekVeri=metin;

try {

//MD5 ile Şifrele

MessageDigest messageDigestObjesi = MessageDigest.getInstance("MD5"); messageDigestObjesi.update(sifrelenecekVeri.getBytes());

byte[] messageDigestDizisi = messageDigestObjesi.digest();

StringBuffer sb16 = new StringBuffer();

for (int i = 0; i < messageDigestDizisi.length; i++)

{

//Veriler 16 bit üzerinden şifrelenecek. Aslında farklı seçeneklerde mevcut!

sb16.append(Integer.toString((messageDigestDizisi[i] & 0xff) + 0x100, 16).substring(1));

}

//Veriler şifrelendi.

sifrelenecekVeri = sb16.toString();

} catch (NoSuchAlgorithmException ex) {

System.err.println(ex);

}

// Şifrelenen veriyi döndürdük.

return sifrelenecekVeri;

}

}

Şimdide İstemci (Client) tarafının kodlarını yazalım. Kullandığımız Komponentler aynı onun için tekrar yazmıyorum. MD5Sifreleme class’ımızıda burada aynen kullanıyoruz. Kodlarımızda ufak tefek değişiklikler var. Burada ServerSocket kullanmıyoruz, çünkü bu program sadece İstemci (Client) görevi yapacak.

import com.sifre.MD5Sifreleme;

import java.io.*;

import java.net.*;

public class istemci extends javax.swing.JFrame {

private static final long serialVersionUID = 1L;

private ObjectOutputStream yazici;

private ObjectInputStream okuyucu;

private String mesaj = "";

private Socket istemciSoketi;

private final String IpNo;

private final int PortNo;

public istemci() {

initComponents();

IpNo = "127.0.0.1";

PortNo = 8890;

}

public void istemciyiBaslat() {

try {

serveraBaglan();

veriOkuYaz();

baglantiyiBekle();

baglantiyiKapat();

} catch (IOException ex) {

jTextArea1.append("\nServer programına ulaşılamıyor. Program durduruldu...");

}

}

private void veriOkuYaz() throws IOException {

yazici = new ObjectOutputStream(istemciSoketi.getOutputStream());

yazici.flush();

okuyucu = new ObjectInputStream(istemciSoketi.getInputStream());

}

private void serveraBaglan() throws IOException {

jTextArea1.setText("\nServer 'a Bağlantı Aranıyor...");

istemciSoketi = new Socket(IpNo, PortNo);

jButton1.setEnabled(true);

}

private void baglantiyiBekle() throws IOException {

do {

try {

mesaj = (String) okuyucu.readObject();

jTextArea1.append("\n" + mesaj);

jTextArea1.setCaretPosition(jTextArea1.getText().length());

} catch (IOException | ClassNotFoundException ex) {

break;

}

} while (!mesaj.equals("SERVER>>> TERMINATE"));

}

private void baglantiyiKapat() throws IOException {

jTextArea1.append("\nBağlantı Kapatıldı. Programı kapatıp tekrar deneyin.");

yazici.close();

okuyucu.close();

istemciSoketi.close();

jButton1.setEnabled(false);

}

private void veriGonder(String mesaj) {

try {

yazici.writeObject("İstemci>>> " + mesaj);

yazici.flush();

jTextArea1.append("\nİstemci>>> " + mesaj);

} catch (IOException ex) {

}

}

// <editor-fold defaultstate="collapsed" desc="Generated Code">

private void initComponents() {

jScrollPane1 = new javax.swing.JScrollPane();

jTextArea1 = new javax.swing.JTextArea();

jTextField1 = new javax.swing.JTextField();

jButton1 = new javax.swing.JButton();

jLabel4 = new javax.swing.JLabel();

jMenuBar1 = new javax.swing.JMenuBar();

setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

setTitle("Simple_BYLOCK_Istemci");

setBackground(new java.awt.Color(102, 102, 102));

setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));

setLocationByPlatform(true);

setPreferredSize(new java.awt.Dimension(340, 346));

jTextArea1.setEditable(false);

jTextArea1.setColumns(20);

jTextArea1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jTextArea1.setRows(5);

jTextArea1.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));

jTextArea1.setCursor(new java.awt.Cursor(java.awt.Cursor.TEXT_CURSOR));

jScrollPane1.setViewportView(jTextArea1);

jTextField1.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N

jTextField1.setHorizontalAlignment(javax.swing.JTextField.LEFT);

jTextField1.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));

jTextField1.setPreferredSize(new java.awt.Dimension(32, 18));

jButton1.setText("Gönder");

jButton1.setEnabled(false);

jButton1.addActionListener(new java.awt.event.ActionListener() {

public void actionPerformed(java.awt.event.ActionEvent evt) {

jButton1ActionPerformed(evt);

}

});

jLabel4.setIcon(new javax.swing.ImageIcon("C:\\Users\\win7\\Documents\\NetBeansProjects\\SimpleBylockSunucu\\image\\kilit.jpg")); // NOI18N

jLabel4.setText("jLabel4");

setJMenuBar(jMenuBar1);

javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());

getContentPane().setLayout(layout);

layout.setHorizontalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addComponent(jScrollPane1)

.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()

.addComponent(jTextField1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)

.addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 100, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGroup(layout.createSequentialGroup()

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 234, javax.swing.GroupLayout.PREFERRED_SIZE)

.addGap(0, 100, Short.MAX_VALUE)))

.addContainerGap())

);

layout.setVerticalGroup(

layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)

.addGroup(layout.createSequentialGroup()

.addContainerGap()

.addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 147, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)

.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)

.addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)

.addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)

.addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))

.addGap(29, 29, 29))

);

jTextField1.getAccessibleContext().setAccessibleDescription("");

getAccessibleContext().setAccessibleDescription("");

pack();

}// </editor-fold>

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

// MD5Sifreleme sınıfından bir nesne oluşturuyoruz

MD5Sifreleme m5Sifreleme = new MD5Sifreleme();

// Verileri şifreleyen metot burada çağırılıyor.

String sifreliVeri = m5Sifreleme.md5Sifrele(jTextField1.getText());

// Şifrelenmiş veriyi gönderdik.

veriGonder(sifreliVeri);

jTextField1.setText("");

}

public static void main(String args[]) {

istemci ist = new istemci();

ist.setVisible(true);

ist.istemciyiBaslat();

}

// Variables declaration - do not modify

private javax.swing.JButton jButton1;

private javax.swing.JLabel jLabel4;

private javax.swing.JMenuBar jMenuBar1;

private javax.swing.JScrollPane jScrollPane1;

private javax.swing.JTextArea jTextArea1;

private javax.swing.JTextField jTextField1;

// End of variables declaration

}

Şimdi önce sunucu’yu sonrada istemci’yi çalıştıralım. Görüntü aşağıdaki gibi olmalı.

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

Mesajı yazalım. Görüntü aşağıdaki gibi olacak.

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

Şimdide Mesajı Gönderelim.

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

ByLock Programı Nasıl Yazılır ?

Gördüğünüz gibi verilerimiz şifrelenmiş olarak gidiyor. Ne konuştuğumuzu artık bizden başka kimse bilemez.

Evet. Meşhur şifreli haberleşme programını (Bylock) inceledik. Umarım bir fikir verebilmişimdir.

Bylock Mantığı bana göre bu şekilde. Daha başka şifreleme algoritmalarıda var. Siz isterseniz onlardan birini kullanıp daha karmaşık şifreleme metotları geliştirebilir yada isterseniz kendi şifreleme algoritmanızı oluşturabilirsiniz. Bu program tam anlamıyla bir Bylock programı olamaz. Geliştirilmesi gerekir. Biz mantığı incelemeye çalıştığımız için derine girmedim.

Selametle.

Github Source Code Client
Github Source Code Server

Benzer İçerikler

JSF EĞİTİM SETİ

WordPress

Blogger

Soysal Medyada Paylaş