Advertisement
Guest User

Untitled

a guest
Apr 27th, 2017
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.77 KB | None | 0 0
  1. import java.math.BigInteger;
  2.  
  3. /**
  4. * Created by Bogdanel on 25.04.2017.
  5. */
  6. public class Wiener {
  7.  
  8. private BigInteger e;
  9. private BigInteger N;
  10. private BigInteger p;
  11. private BigInteger q;
  12.  
  13.  
  14.  
  15. public Wiener(BigInteger e, BigInteger N){
  16. this.e = e;
  17. this.N = N;
  18. p = new BigInteger("0");
  19. q = new BigInteger("0");
  20. }
  21.  
  22.  
  23. void function(){
  24.  
  25. BigInteger qi1, qi2, qi3;
  26. BigInteger alphai1, alphai2, alphai3;
  27. BigInteger betai1, betai2, betai3;
  28. BigInteger rem, rem1, rem2;
  29. rem1 = e;
  30. rem2 = N;
  31.  
  32. BigInteger aRez[] = rem1.divideAndRemainder(rem2);
  33. qi1 = aRez[0];
  34. rem1 = rem2;
  35. rem = aRez[1];
  36. rem2 = aRez[1];
  37.  
  38. BigInteger bRez[] = rem1.divideAndRemainder(rem2);
  39. qi2 = bRez[0];
  40. rem1 = rem2;
  41. rem = bRez[1];
  42. rem2 = bRez[1];
  43.  
  44. alphai1 = aRez[0];
  45. alphai2 = qi1.multiply(qi2).add(BigInteger.ONE);
  46.  
  47. betai1 = BigInteger.ONE;
  48. betai2 = qi2;
  49.  
  50. if(criterion(alphai2, betai2)){
  51. System.out.println("found");
  52. return;
  53. }
  54.  
  55. while(rem.intValue() != 0){
  56. BigInteger[] div = rem1.divideAndRemainder(rem2);
  57. rem1 = rem2;
  58. rem = div[1];
  59. rem2 = rem;
  60. qi3 = div[0];
  61.  
  62. alphai3 = qi3.multiply(alphai2).add(alphai1);
  63. alphai1 = alphai2;
  64. alphai2 = alphai3;
  65.  
  66. betai3 = qi3.multiply(betai2).add(betai1);
  67. betai1 = betai2;
  68. betai2 = betai3;
  69.  
  70. System.out.println("Alpha : " + alphai3 + " BETa : " + betai3);
  71.  
  72. if(criterion(alphai3, betai3)){
  73. System.out.println("Succes");
  74. BigInteger phi = p.subtract(BigInteger.ONE).multiply(p.subtract(BigInteger.ONE));
  75. BigInteger d = e.modInverse(phi);
  76.  
  77. System.out.println("Cheia privata este : " + d);
  78. return;
  79. }
  80.  
  81. }
  82.  
  83. }
  84.  
  85.  
  86. //x*y = N (x-1)*(y-1) = (E * D - 1)/L trebuie sa aiba solutii intregi
  87. //echivalent y = ((+-)sqrt(delta)-b)/2 -> prima sol e Q cealalta P
  88.  
  89. //delta = b*b - 4*N
  90. //b=(e*d-1)/L) - N - 1
  91.  
  92. boolean criterion(BigInteger L, BigInteger D){
  93.  
  94. BigInteger b;
  95. BigInteger delta;
  96.  
  97. BigInteger first = e.multiply(D);
  98. first = first.subtract(BigInteger.ONE);
  99. if(L.intValue() == 0)
  100. return false;
  101. //check if first L divides b\
  102. //
  103. if(!first.mod(L).equals(BigInteger.ZERO))
  104. return false;
  105. first = first.divide(L);
  106.  
  107.  
  108. //
  109. // b=first-n-1
  110. b = first.subtract(N).subtract(BigInteger.ONE);
  111.  
  112. b = N.subtract(first).add(BigInteger.ONE);
  113.  
  114. //formam delta: b*b
  115. delta = b.multiply(b);
  116.  
  117. //-4*N
  118. delta = delta.subtract(N.multiply(new BigInteger("4")));
  119. if(delta.compareTo(BigInteger.valueOf(0)) < 1){
  120. return false;
  121. }
  122. BigInteger y;
  123.  
  124. BigInteger sqrtDelta = bigIntSqRootFloor(delta);
  125.  
  126.  
  127. if(sqrtDelta.multiply(sqrtDelta).equals(delta) == false)
  128. return false;
  129. //p = sqrt(delta)-b
  130.  
  131. p = sqrtDelta.subtract(b);
  132.  
  133. if(sqrtDelta.mod(new BigInteger("2")).intValue() == 1) {
  134. p = BigInteger.ZERO;
  135. return false;
  136. }
  137.  
  138. p = p.divide(new BigInteger("2"));
  139. System.out.println("P" + p);
  140.  
  141. //q = (-sqrtdelta - b)/2
  142.  
  143. q = sqrtDelta.multiply(new BigInteger("-1"));
  144. q = q.subtract(b);
  145. q = q.divide(new BigInteger("2"));
  146.  
  147. return true;
  148.  
  149.  
  150. }
  151.  
  152.  
  153. public static BigInteger bigIntSqRootFloor(BigInteger x)
  154. throws IllegalArgumentException {
  155. if (x.compareTo(BigInteger.ZERO) < 0) {
  156. throw new IllegalArgumentException("Negative argument.");
  157. }
  158. if (x .equals(BigInteger.ZERO) || x.equals(BigInteger.ONE)) {
  159. return x;
  160. }
  161. BigInteger two = BigInteger.valueOf(2L);
  162. BigInteger y;
  163.  
  164. for (y = x.divide(two);
  165. y.compareTo(x.divide(y)) > 0;
  166. y = ((x.divide(y)).add(y)).divide(two));
  167. return y;
  168. }
  169.  
  170.  
  171. public BigInteger getP(){
  172. return p;
  173. }
  174. public BigInteger getQ(){
  175. return q;
  176. }
  177.  
  178. public static void main(String[] args) {
  179. // GenerateKeys generator = GenerateKeys.getInstance();
  180.  
  181. BigInteger N = new BigInteger("64741");
  182. BigInteger e = new BigInteger("42667");
  183. Wiener wiener = new Wiener(e, N);
  184.  
  185. BigInteger a = new BigInteger("2");
  186. BigInteger b = new BigInteger("3");
  187.  
  188. wiener.function();
  189.  
  190. }
  191.  
  192. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement