Advertisement
Krefeld187

Untitled

Mar 27th, 2021
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.43 KB | None | 0 0
  1. import static java.lang.Math.*;
  2. import java.util.Random;
  3. import java.io.Console;
  4. import java.io.File;
  5. import java.io.FileNotFoundException;
  6. import java.util.*;
  7. import java.math.*;
  8. import java.math.BigInteger;
  9. public class RSA3
  10. {
  11. //String in ein char array
  12. static char[] auslesen(String str)
  13. {
  14. char temp [] = new char[str.length()];
  15. for(int i = str.length()-1; i >= 0; --i)
  16. {
  17. temp[i] = str.charAt(i);
  18. }
  19. return temp;
  20. }
  21.  
  22. // groesster gemeinsamer Teiler
  23. public static BigInteger gcd(BigInteger a, BigInteger b)
  24. {
  25. if (a.compareTo(b) < 0)
  26. {
  27. BigInteger tmp = a;
  28. a=b;
  29. b=tmp;
  30. }
  31.  
  32. BigInteger r = a.mod(b);
  33.  
  34. while (r.compareTo(new BigInteger("0")) != 0)
  35. {
  36. a=b;
  37. b=r;
  38. r = a.mod(b);
  39. }
  40. return b;
  41. }
  42.  
  43. // Erzeugt eine "große" Primezahl die 200 steht fuer die bitlaenge
  44. static BigInteger PrimezahlGenerator()
  45. {
  46. BigInteger maxP = BigInteger.probablePrime(1500, new Random());
  47. return maxP;
  48. }
  49.  
  50. static BigInteger BestimmungVon_E(BigInteger n)
  51. {
  52. BigInteger temp = new BigInteger("0");
  53. BigInteger tempres = new BigInteger("0");
  54. BigInteger i = new BigInteger("2");
  55. boolean isPrime = false;
  56. while(i.compareTo(n) < 0)
  57. {
  58. isPrime = i.isProbablePrime(1);
  59. tempres = n.remainder(i);
  60. if(tempres.compareTo(temp) != 0 && isPrime)
  61. {
  62. return i;
  63. }
  64. i = i.add(new BigInteger("1"));
  65. }
  66. return new BigInteger("1");
  67. }
  68.  
  69. static BigInteger CharinInt(char[] text)
  70. {
  71. BigInteger wert = new BigInteger("0");
  72. char arrAlp[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  73. for(int i = 0; i < text.length; ++i)
  74. {
  75. for(int k = 0; k < arrAlp.length; ++k)
  76. {
  77. if(Character.compare(text[i], arrAlp[k]) == 0)
  78. {
  79. if(i == 0)
  80. {
  81. BigInteger temp = BigInteger.valueOf(k);
  82. wert = wert.add(new BigInteger("1").add(temp));
  83. }
  84. else
  85. {
  86. BigInteger temp = BigInteger.valueOf(k);
  87. temp = temp.add(new BigInteger("1"));
  88. wert = wert.add(temp.multiply(new BigInteger("26").pow(i)));
  89. }
  90. }
  91. }
  92. }
  93. return wert;
  94. }
  95.  
  96. static char intToChar(BigInteger n)
  97. {
  98. int temp = n.intValue();
  99. char arrAlp[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  100. return arrAlp[temp];
  101. }
  102.  
  103. static char[] UmwandlerOhneLaenge(BigInteger Eingabe)
  104. {
  105. List<BigInteger> Umw = new ArrayList<BigInteger>();
  106. int i = 0;
  107. while(true)
  108. {
  109. BigInteger Rest = Eingabe.mod(new BigInteger("26"));;
  110. Eingabe= Eingabe.subtract(Rest);
  111. Eingabe = Eingabe.divide(new BigInteger("26"));
  112. Umw.add(i, Rest);
  113. ++i;
  114. if(Eingabe.mod(new BigInteger("26")).compareTo(new BigInteger("0")) == 0) // Eingabe % 26 == 0
  115. {
  116. Umw.add(i, Eingabe.mod(new BigInteger("26")));
  117. break;
  118. }
  119. }
  120. char temp[] = new char [Umw.size()];
  121.  
  122. for(int k = 0; k < temp.length-1; ++k)
  123. {
  124. temp[k] = intToChar((Umw.get(k)).subtract(new BigInteger("1")));
  125. }
  126. return temp;
  127. }
  128.  
  129. static BigInteger SMohneAusgabe(BigInteger base, BigInteger exp, BigInteger mod)
  130. {
  131. BigInteger a = base;
  132.  
  133. BigInteger n = mod;
  134.  
  135. BigInteger z = new BigInteger("0");
  136.  
  137. BigInteger temp = new BigInteger("2");
  138.  
  139. BigInteger[] b = intToBinaryRightOrder(exp);
  140. int len = b.length;
  141. if(b[len - 1].compareTo(new BigInteger("1")) == 0)
  142. z = a.mod(n);
  143. else
  144. z = BigInteger.valueOf(1);
  145. for(int i = b.length-2; i >= 0; --i)
  146. {
  147. a = a.modPow(temp, n);
  148. if(b[i].compareTo(new BigInteger("1")) == 0)
  149. {
  150. z = z.multiply(a);
  151. z = z.mod(n);
  152. }
  153. }
  154. return z;
  155. }
  156.  
  157. static BigInteger[] intToBinaryRightOrder(BigInteger num)
  158. {
  159. List<BigInteger> arr = new ArrayList<BigInteger>();
  160. while(num.compareTo(new BigInteger("0")) > 0)
  161. {
  162. arr.add(num.mod(new BigInteger("2")));
  163. num = num.divide(new BigInteger("2"));
  164. }
  165. Collections.reverse(arr);
  166. BigInteger res[] = new BigInteger[arr.size()];
  167. for(int i = 0; i < res.length; ++i)
  168. {
  169. res[i] = arr.get(i);
  170. }
  171. return res;
  172. }
  173.  
  174. static BigInteger[] intToBinary(BigInteger num)
  175. {
  176. List<BigInteger> arr = new ArrayList<BigInteger>();
  177. while(num.compareTo(new BigInteger("0")) > 0)
  178. {
  179. arr.add(num.mod(new BigInteger("2")));
  180. num = num.divide(new BigInteger("2"));
  181. }
  182. BigInteger res[] = new BigInteger[arr.size()];
  183. for(int i = 0; i < res.length; ++i)
  184. {
  185. res[i] = arr.get(i);
  186. }
  187. return res;
  188. }
  189.  
  190. static BigInteger[] RSA_public()
  191. {
  192. BigInteger[] arr = new BigInteger[3];
  193. BigInteger temp = new BigInteger("1");
  194. BigInteger p = PrimezahlGenerator();
  195. BigInteger q = PrimezahlGenerator();
  196. BigInteger N = p.multiply(q);
  197. BigInteger N_0 = (p.subtract(temp)).multiply((q.subtract(temp)));
  198. BigInteger e = BestimmungVon_E(N_0);
  199. arr[0] = e;
  200. arr[1] = N;
  201. arr[2] = N_0;
  202. System.out.println("p:"+ p);
  203. System.out.println("q:" + q);
  204. System.out.println("n:" + N);
  205. System.out.println("e:" + e);
  206. System.out.println("phiN:" + N_0);
  207. return arr;
  208. }
  209.  
  210. static BigInteger RSA_private(BigInteger phiN, BigInteger e)
  211. {
  212. BigInteger a,b,q,s,r,t,u,v,d;
  213. a = phiN;
  214. b = e;
  215. u = BigInteger.valueOf(1);
  216. t = BigInteger.valueOf(1);
  217. v = BigInteger.valueOf(0);
  218. s = BigInteger.valueOf(0);
  219. while(b.compareTo(new BigInteger("0"))>0)
  220. {
  221. q = a.divide(b);
  222. r = a.mod(b);
  223. a = b;
  224. b = r;
  225.  
  226. r = u.subtract(q.multiply(s));
  227. u = s;
  228. s = r;
  229.  
  230. r = v.subtract(q.multiply(t));
  231. v = t;
  232. t = r;
  233. }
  234.  
  235. if(v.compareTo(new BigInteger("0")) < 0)
  236. {
  237. v = v.add(phiN);
  238. }
  239. d = v;
  240. return d;
  241. }
  242.  
  243. static BigInteger verschlusseln(char[] Nachricht, BigInteger[] publicKey)
  244. {
  245. BigInteger x = CharinInt(Nachricht);
  246. BigInteger y = SMohneAusgabe(x, publicKey[0], publicKey[1]);
  247. System.out.println("Verschlusselt : " + y);
  248. return y;
  249. }
  250. static BigInteger test;
  251. static char[] entschlusseln(BigInteger y, BigInteger[] privateKey)
  252. {
  253. BigInteger x = SMohneAusgabe(y, privateKey[0], privateKey[1]);
  254. test = x;
  255. System.out.println("Entschluesselt : " + x);
  256. char text[] = UmwandlerOhneLaenge(x);
  257. return text;
  258. }
  259.  
  260. static String start(String Nachricht)
  261. {
  262. BigInteger[] test2 = new BigInteger[2];
  263. char nachricht[] = auslesen(Nachricht);
  264. BigInteger publicKey[] = RSA_public(); // return Werte => e , N , N_0(phiN) // [0] = e, [1] = N, [2] = phiN
  265. BigInteger privateKey[] = new BigInteger[2]; // [0] = d, [1] = N
  266. privateKey[0] = RSA_private(publicKey[2], publicKey[0]);
  267. privateKey[1] = publicKey[1];
  268. // Beide Keys fertig und Nachricht in einem Char array
  269.  
  270. BigInteger geheimText = verschlusseln(nachricht, publicKey);
  271. test2[0] = geheimText;
  272. char[] klarText = entschlusseln(geheimText, privateKey);
  273. test2[1] = test;
  274. String KlarTextString = new String(klarText);
  275. System.out.println("Entschlusselter Text " + KlarTextString);
  276. if(test2[0].compareTo(test2[1]) == 0)
  277. {
  278. System.out.println("true");
  279. }
  280. return KlarTextString;
  281. }
  282.  
  283. static String Texter(int max)
  284. {
  285. Random rnd = new Random();
  286. char temp[] = new char[max];
  287. char arrAlp[] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
  288. for(int i = 0; i < max; ++i)
  289. {
  290. int asd = 1 + rnd.nextInt(26);
  291. temp[i] = arrAlp[asd-1];
  292. }
  293. String wort = new String(temp);
  294. return wort;
  295. }
  296.  
  297. public static void main(String[] args)
  298. {
  299. start("abcdefghijklmnopqrstuvwxy");
  300. }
  301. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement