· 6 years ago · Apr 28, 2019, 08:00 PM
1// КурÑÐ¾Ð²Ð°Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ð°
2// Ñтудента группы A-08м-1
3// Бабака Ðикиты Григорьевича
4//
5// ЛиÑтинг клаÑÑа Main.java
6package net.BabakNG;
7
8import com.google.common.base.Stopwatch;
9import javax.crypto.*;
10import java.security.*;
11import java.sql.*;
12
13public class Main {
14 public static final String conn = "jdbc:sqlite:D:/Program Files/IdeaProjects/rsAes/SQLiteDB/RsAes.db"; // Ñтрока Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº БД
15 public static final String openText = "abc defg hijkl MNOpq rsTUVwxyz"; // Ñтрока открытого текÑта
16
17 // ЗанеÑение шифртекÑта в БД по таблице, размеру ключа и открытому текÑту
18 public static void updateDB(String table, int keySize, String opText, byte[] crText) {
19 String sqlCommand = "UPDATE " + table + " SET OpenText = ?, " + "CryptoText = ? " + "WHERE KeySize = ?";
20
21 try {
22 Class.forName("org.sqlite.JDBC");
23 Connection conn = DriverManager.getConnection(Main.conn); // подключение к БД
24
25 PreparedStatement pStmt = conn.prepareStatement(sqlCommand); // задание параметров Ð´Ð»Ñ SQL-запроÑа
26 pStmt.setString(1, opText);
27 pStmt.setBytes(2, crText);
28 pStmt.setInt(3, keySize);
29 pStmt.executeUpdate();
30
31 pStmt.close();
32 conn.close();
33 //System.out.println("УÑÐ¿ÐµÑˆÐ½Ð°Ñ Ð·Ð°Ð¿Ð¸ÑÑŒ в БД");
34 } catch (ClassNotFoundException e) {
35 e.printStackTrace();
36 System.out.println("Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°");
37 } catch (SQLException e) {
38 e.printStackTrace();
39 System.out.println("Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº БД");
40 }
41 }
42
43 // Получение шифртекÑта из БД по таблице, размеру ключа и открытому текÑту
44 public static byte[] getDB(String table, int keySize, String opText) {
45 String sqlCommand = "SELECT CryptoText FROM " + table + " WHERE KeySize = " + keySize + " AND OpenText = '" + opText + "' LIMIT 1";
46
47 try {
48 Class.forName("org.sqlite.JDBC");
49 Connection conn = DriverManager.getConnection(Main.conn); // подключение к БД
50
51 Statement stmt = conn.createStatement();
52 ResultSet rs = stmt.executeQuery(sqlCommand);
53 byte[] bytes = rs.getBytes("CryptoText");
54
55 rs.close();
56 stmt.close();
57 conn.close();
58 //System.out.println("УÑпешное Ñчитывание из БД");
59 return bytes;
60 } catch (ClassNotFoundException e) {
61 e.printStackTrace();
62 System.out.println("Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð´Ñ€Ð°Ð¹Ð²ÐµÑ€Ð°");
63 return null;
64 } catch (SQLException e) {
65 e.printStackTrace();
66 System.out.println("Ошибка Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ðº БД");
67 return null;
68 }
69 }
70
71 // Дешифрование
72 public static byte[] deCript(Cipher dCipher, byte[] crBytes) throws BadPaddingException, IllegalBlockSizeException {
73 Stopwatch timer = Stopwatch.createUnstarted(); // Ñоздание таймера
74 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
75
76 timer.start(); // запуÑк таймера
77 byte[] decrBytes = dCipher.doFinal(crBytes); // дешифрование
78 timer.stop(); // оÑтановка таймера
79
80 System.out.println("Затраченное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° дешифрование: " + timer);
81 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
82 System.out.println();
83
84 return decrBytes;
85 }
86
87 public static void main(String[] args) {
88 try {
89 Stopwatch timer = Stopwatch.createUnstarted(); // Ñоздание таймера
90
91 // AES
92 System.out.println("AES");
93 for (int i = 0; i < 3; i++) {
94 int[] keySizes = new int[] {256,192,128};
95
96 Cipher cipher = Cipher.getInstance("AES"); // Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ наÑтройка параметров шифра
97 KeyGenerator kGen = KeyGenerator.getInstance("AES");
98 SecureRandom secureRandom = new SecureRandom();
99 secureRandom.setSeed(1001L); // задание Ñида Ð´Ð»Ñ Ð“Ð¡Ð§
100 kGen.init(keySizes[i],secureRandom); // задание размера ключа
101 SecretKey key = kGen.generateKey(); // Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñлучайного ключа
102 cipher.init(Cipher.ENCRYPT_MODE, key); // Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° шифрование Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ ключом
103
104 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
105 timer.start(); // запуÑк таймера
106 byte[] bytes = cipher.doFinal(openText.getBytes()); // шифрование
107 timer.stop(); // оÑтановка таймера
108
109 updateDB("Aes_tab",keySizes[i],openText,bytes);
110 byte[] crBytes = getDB("Aes_tab",keySizes[i],openText);
111
112 System.out.println("Размер ключа: " + keySizes[i]);
113 System.out.println("Затраченное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° шифрование: " + timer);
114 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
115 System.out.println("Размер зашифрованной Ñтроки: " + crBytes.length + " байт");
116
117 Cipher decriptCipher = Cipher.getInstance("AES");
118 decriptCipher.init(Cipher.DECRYPT_MODE, key); // Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° дешифрование Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ ключом
119
120 byte[] decrBytes = deCript(decriptCipher, crBytes); // дешифрование
121
122 }
123
124 // RSA
125 System.out.println("RSA");
126 for (int i = 0; i < 3; i++) {
127 int[] keySizes = new int[] {15360,7680,3072};
128
129 Cipher cipher = Cipher.getInstance("RSA"); // Ð˜Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¸ наÑтройка параметров шифра
130 KeyPairGenerator kGen = KeyPairGenerator.getInstance("RSA");
131 SecureRandom secureRandom = new SecureRandom();
132 secureRandom.setSeed(1001L); // задание Ñида Ð´Ð»Ñ Ð“Ð¡Ð§
133 kGen.initialize(keySizes[i],secureRandom); // задание размера ключа
134 KeyPair keyPair = kGen.generateKeyPair(); // Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð°Ñ€Ñ‹ Ñлучайных ключей
135 Key publicKey = keyPair.getPublic(); // открытый ключ
136 Key privateKey = keyPair.getPrivate(); // Ñекретный ключ
137 cipher.init(Cipher.ENCRYPT_MODE, publicKey); // Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° шифрование Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ открытым ключом
138
139 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
140 timer.start(); // запуÑк таймера
141 byte[] bytes = cipher.doFinal(openText.getBytes()); // шифрование
142 timer.stop(); // оÑтановка таймера
143
144 updateDB("Rsa_tab",keySizes[i],openText,bytes);
145 byte[] crBytes = getDB("Rsa_tab",keySizes[i],openText);
146
147 System.out.println("Размер ключа: " + keySizes[i]);
148 System.out.println("Затраченное Ð²Ñ€ÐµÐ¼Ñ Ð½Ð° шифрование: " + timer);
149 timer.reset(); // ÑÐ±Ñ€Ð¾Ñ Ñ‚Ð°Ð¹Ð¼ÐµÑ€Ð°
150 System.out.println("Размер зашифрованной Ñтроки: " + crBytes.length + " байт");
151
152 Cipher decriptCipher = Cipher.getInstance("RSA");
153 decriptCipher.init(Cipher.DECRYPT_MODE, privateKey); // Ð°ÐºÑ‚Ð¸Ð²Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° дешифрование Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ приватным ключом
154
155 byte[] decrBytes = deCript(decriptCipher, crBytes); // дешифрование
156 }
157
158 } catch (NoSuchPaddingException | NoSuchAlgorithmException | InvalidKeyException | IllegalBlockSizeException | BadPaddingException e) {
159 e.printStackTrace();
160 System.out.println("Ошибка шифрованиÑ");
161 }
162 }
163}