· 7 years ago · Jul 08, 2018, 05:12 PM
1From bd2abc9ee782495f931219068f16b5b12c2b5f71 Mon Sep 17 00:00:00 2001
2From: Vladimir Meshkov <vld_meshkov@gmail.com>
3Date: Sun, 8 Jul 2018 20:00:31 +0000
4Subject: [PATCH] =?UTF-8?q?=D0=A8=D0=B8=D1=84=D1=80=D0=BE=D0=B2=D0=B0?=
5 =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=D0=B5?=
6 =?UTF-8?q?=D1=82.=20=D0=9D=D0=B5=20=D1=81=D1=85=D0=BE=D0=B4=D1=8F=D1=82?=
7 =?UTF-8?q?=D1=81=D1=8F=20=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D1=83?=
8 =?UTF-8?q?=D0=B5=D0=BC=D1=8B=D0=B5=20=D0=BA=D0=BB=D1=8E=D1=87=D0=B8=20DH.?=
9MIME-Version: 1.0
10Content-Type: text/plain; charset=UTF-8
11Content-Transfer-Encoding: 8bit
12
13---
14 .../encryption/EncryptionManager.java | 63 +++++++++++++++++++++-
15 1 file changed, 61 insertions(+), 2 deletions(-)
16
17diff --git a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/encryption/EncryptionManager.java b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/encryption/EncryptionManager.java
18index cb8567f..0cb2d44 100644
19--- a/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/encryption/EncryptionManager.java
20+++ b/app/src/main/java/io/github/webbluetoothcg/bletestperipheral/encryption/EncryptionManager.java
21@@ -1,5 +1,7 @@
22 package io.github.webbluetoothcg.bletestperipheral.encryption;
23
24+import android.util.Log;
25+
26 import java.security.KeyFactory;
27 import java.security.KeyPair;
28 import java.security.KeyPairGenerator;
29@@ -19,23 +21,80 @@ import javax.crypto.spec.SecretKeySpec;
30 * Created by Evgeny on 30.06.2018.
31 */
32
33+
34 public class EncryptionManager {
35 private static final int KEY_SIZE = 512;
36 private static final String ALGORITHM = "DH";
37 private static final String ALGORITHM_ENCRYPT = "AES";
38- private static final String AES_FUNC = "AES/CBC/PKCS5Padding";
39+ private static final String AES_FUNC = "AES_256/CBC/PKCS7Padding"; // По Ñтому алгоритму данные ÑˆÐ¸Ñ„Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ñовпадают Ñ ntf52.
40 private static final byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
41 IvParameterSpec ivspec = new IvParameterSpec(iv);
42
43 private PrivateKey privateKey;
44 private PublicKey publicKey;
45 private PublicKey receivedPublicKey;
46- private byte[] secretKey;
47+
48+ // ТеÑтовый ключ AES-256
49+ private byte [] secretKey;
50+ private String secretKeyStr = "Parkpass private key dummy bytes";
51+
52+ // ТеÑтовое Ñообщение Ð´Ð»Ñ ÐºÐ¾Ð´Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ
53+ private String in_message = "Parkpass test message";
54
55 public EncryptionManager() {
56+ testCrypto();
57 generateKeys();
58 }
59
60+ public static String bytesToHex(byte[] bytes) {
61+ final char[] hexArray = "0123456789ABCDEF".toCharArray();
62+ char[] hexChars = new char[bytes.length * 2];
63+ for ( int j = 0; j < bytes.length; j++ ) {
64+ int v = bytes[j] & 0xFF;
65+ hexChars[j * 2] = hexArray[v >>> 4];
66+ hexChars[j * 2 + 1] = hexArray[v & 0x0F];
67+ }
68+ return new String(hexChars);
69+ }
70+
71+ public void testCrypto() {
72+ try {
73+ final byte [] skey = secretKeyStr.getBytes("UTF-8");
74+ final SecretKeySpec keySpec = new SecretKeySpec(skey, 0, 32, ALGORITHM_ENCRYPT);
75+ final Cipher cipher = Cipher.getInstance(AES_FUNC);
76+ cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivspec);
77+ byte [] inm = in_message.getBytes("UTF-8");
78+ final byte[] encryptedMessage = cipher.doFinal(inm);
79+
80+ Log.d("Message: ", bytesToHex(inm));
81+ Log.d("Secret key: ", bytesToHex(skey));
82+ Log.d("Cipher: ", bytesToHex(encryptedMessage));
83+
84+ final Cipher decryptor = Cipher.getInstance(AES_FUNC);
85+ decryptor.init(Cipher.DECRYPT_MODE, keySpec, ivspec);
86+
87+
88+ byte [] out_bytes = decryptor.doFinal(encryptedMessage);
89+ String out_str = new String(out_bytes, "UTF-8");
90+ Log.d("Decrypted: ", out_str);
91+ Log.d("Decrypted hex: ", bytesToHex(out_bytes));
92+ } catch (Exception e) {
93+ Log.e("Cipher error!!!", e.toString());
94+ e.printStackTrace();
95+ }
96+
97+ /*
98+ Message: 5061726B706173732074657374206D657373616765
99+ Key: 5061726B706173732070726976617465206B65792064756D6D79206279746573
100+ Cipher: 1522620ACCBFF81A42787C70228A9B3839CBFF5A7B12F284AC6BD264A27D4DC3
101+ */
102+ }
103+
104+
105+ /**
106+ * TODO Ð”Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹ раÑÑмотреть https://nelenkov.blogspot.com/2011/12/using-ecdh-on-android.html
107+ * ECDH Ñо Ñтандартными кривыми. Мой контроллер не умеет X509, но умеет ECDH Ñ ÐºÑ€Ð¸Ð²Ñ‹Ð¼Ð¸ secp256r1 и secp256k1
108+ */
109 public void generateKeys() {
110 try {
111 final KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
112--
1131.8.4.msysgit.0