[Java] RC5算法 →→→→→进入此内容的聊天室

来自 , 2020-04-12, 写在 Java, 查看 107 次.
URL http://www.code666.cn/view/4558dbb6
  1. interface RC5 {
  2.   public int keySize();
  3.   public long encrypt(long pt);
  4.   public long decrypt(long ct);
  5.   public void setup(byte[] K);
  6. }
  7.  
  8. // RC5-32/12/8 implementation. Unrolls all important loops.
  9.  
  10. class RC5_32_12_8 implements RC5 {
  11.   private static final int w = 32;             /* word size in bits                 */
  12.   private static final int r = 12;             /* number of rounds                  */
  13.   private static final int b =  8;             /* number of bytes in key            */
  14.   private static final int c =  2;             /* number  words in key = ceil(8*b/w)*/
  15.   private static final int t = 26;             /* size of table S = 2*(r+1) words   */
  16. //  static int[] initS = new int[t];
  17.   static int initS0, initS1, initS2, initS3, initS4, initS5, initS6, initS7, initS8, initS9;
  18.   static int initS10, initS11, initS12, initS13, initS14, initS15, initS16, initS17, initS18, initS19;
  19.   static int initS20, initS21, initS22, initS23, initS24, initS25;
  20. //  int[] S = new int[t];                      /* expanded key table                */
  21.   int S0, S1, S2, S3, S4, S5, S6, S7, S8, S9;
  22.   int S10, S11, S12, S13, S14, S15, S16, S17, S18, S19;
  23.   int S20, S21, S22, S23, S24, S25;
  24.   private static final int P = 0xb7e15163, Q = 0x9e3779b9;  /* magic constants             */
  25.  
  26.   static {
  27.     initS0 = P;
  28. //    for (int i = 1; i < t; i++) {
  29. //      initS[i] = initS[i-1] + Q;
  30. //    }
  31.     initS1  = initS0  + Q;
  32.     initS2  = initS1  + Q;
  33.     initS3  = initS2  + Q;
  34.     initS4  = initS3  + Q;
  35.     initS5  = initS4  + Q;
  36.     initS6  = initS5  + Q;
  37.     initS7  = initS6  + Q;
  38.     initS8  = initS7  + Q;
  39.     initS9  = initS8  + Q;
  40.     initS10 = initS9  + Q;
  41.     initS11 = initS10 + Q;
  42.     initS12 = initS11 + Q;
  43.     initS13 = initS12 + Q;
  44.     initS14 = initS13 + Q;
  45.     initS15 = initS14 + Q;
  46.     initS16 = initS15 + Q;
  47.     initS17 = initS16 + Q;
  48.     initS18 = initS17 + Q;
  49.     initS19 = initS18 + Q;
  50.     initS20 = initS19 + Q;
  51.     initS21 = initS20 + Q;
  52.     initS22 = initS21 + Q;
  53.     initS23 = initS22 + Q;
  54.     initS24 = initS23 + Q;
  55.     initS25 = initS24 + Q;
  56.   }
  57.  
  58.   public int keySize()
  59.   {
  60.     return b;
  61.   }
  62.  
  63. //  int ROTL(int x, int y)
  64. //  {
  65. //    return (x << (y & (w-1))) | (x >>> (w - (y & (w-1))));
  66. //  }
  67. //
  68. //  int ROTR(int x, int y)
  69. //  {
  70. //    return (x >>> (y & (w-1))) | (x << (w - (y & (w-1))));
  71. //  }
  72.  
  73.   public long encrypt(long pt)
  74.   {
  75.     int A = (int)(pt & 0xffffffffL) + S0;
  76.     int B = (int)(pt >>> 32) + S1;
  77. //    for (int i = 1; i <= r; i++) {
  78. //      int x = A ^ B;
  79. //      int y = B & (w-1);
  80. //      A = /*ROTL(A ^ B, B)*/ ((x << y) | (x >>> (w-y))) + S[2*i];
  81. //      x = B ^ A;
  82. //      y = A & (w-1);
  83. //      B = /*ROTL(B ^ A, A)*/ ((x << y) | (x >>> (w-y))) + S[2*i+1];
  84. //    }
  85.     int x, y;
  86.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S2 ; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S3 ;
  87.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S4 ; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S5 ;
  88.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S6 ; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S7 ;
  89.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S8 ; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S9 ;
  90.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S10; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S11;
  91.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S12; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S13;
  92.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S14; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S15;
  93.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S16; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S17;
  94.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S18; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S19;
  95.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S20; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S21;
  96.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S22; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S23;
  97.     x = A ^ B; y = B & (w-1); A = ((x << y) | (x >>> (w-y))) + S24; x = B ^ A; y = A & (w-1); B = ((x << y) | (x >>> (w-y))) + S25;
  98.     return ((long)B << 32) + (A & 0xffffffffL);
  99.   }
  100.  
  101.   public long decrypt(long ct)
  102.   {
  103.     int A = (int)(ct & 0xffffffffL);
  104.     int B = (int)(ct >>> 32);
  105. //    for (int i = r; i > 0; i--) {
  106. //      int x = B - S[2*i+1];
  107. //      int y = A & (w-1);
  108. //      B = /*ROTR(B - S[2*i+1], A)*/ ((x >>> y) | (x << (w-y))) ^ A;
  109. //      x = A - S[2*i];
  110. //      y = B & (w-1);
  111. //      A = /*ROTR(A - S[2*i], B)*/ ((x >>> y) | (x << (w-y))) ^ B;
  112. //    }
  113.     int x, y;
  114.     x = B - S25; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S24; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  115.     x = B - S23; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S22; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  116.     x = B - S21; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S20; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  117.     x = B - S19; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S18; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  118.     x = B - S17; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S16; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  119.     x = B - S15; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S14; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  120.     x = B - S13; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S12; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  121.     x = B - S11; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S10; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  122.     x = B - S9 ; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S8 ; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  123.     x = B - S7 ; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S6 ; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  124.     x = B - S5 ; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S4 ; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  125.     x = B - S3 ; y = A & (w-1); B = ((x >>> y) | (x << (w-y))) ^ A; x = A - S2 ; y = B & (w-1); A = ((x >>> y) | (x << (w-y))) ^ B;
  126.     return ((long)(B - S1) << 32) + ((A - S0) & 0xffffffffL);
  127.   }
  128.  
  129.   public void setup(byte[] K)
  130.   {
  131.     int i, j, k, u=w/8, A, B;
  132.     /* Initialize L, then S, then mix key into S */
  133. //    for (i=b-1,L[c-1]=0; i!=-1; i--) L[i/u] = (L[i/u]<<8)+(K[i]&0xff);
  134.     int L0 = ((K[3] & 0xff) << 24) | ((K[2] & 0xff) << 16) | ((K[1] & 0xff) << 8) | (K[0] & 0xff);
  135.     int L1 = ((K[7] & 0xff) << 24) | ((K[6] & 0xff) << 16) | ((K[5] & 0xff) << 8) | (K[4] & 0xff);
  136. //    for (A=B=i=j=k=0; k<3*t; k++) {  /* 3*t > 3*c */
  137. //      int x = S[i] + (A+B);
  138. //      A = S[i] = /*ROTL(S[i]+(A+B),3);*/ (x << 3) | (x >>> 29);
  139. //      x = L[j] + (A+B);
  140. //      int y = (A+B) & (w-1);
  141. //      B = L[j] = /*ROTL(L[j]+(A+B),(A+B));*/ (x << y) | (x >>> (w-y));
  142. //      /*i = (i+1) % t;*/ i++; if (i >= t) i = 0;
  143. //      /*j = (j+1) % c;*/ j++; if (j >= c) j = 0;
  144. //    }
  145.     A = B = 0;
  146.     int x, y;
  147.     x = initS0  + (A+B); A = S0  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  148.     x = initS1  + (A+B); A = S1  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  149.     x = initS2  + (A+B); A = S2  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  150.     x = initS3  + (A+B); A = S3  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  151.     x = initS4  + (A+B); A = S4  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  152.     x = initS5  + (A+B); A = S5  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  153.     x = initS6  + (A+B); A = S6  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  154.     x = initS7  + (A+B); A = S7  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  155.     x = initS8  + (A+B); A = S8  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  156.     x = initS9  + (A+B); A = S9  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  157.     x = initS10 + (A+B); A = S10 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  158.     x = initS11 + (A+B); A = S11 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  159.     x = initS12 + (A+B); A = S12 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  160.     x = initS13 + (A+B); A = S13 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  161.     x = initS14 + (A+B); A = S14 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  162.     x = initS15 + (A+B); A = S15 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  163.     x = initS16 + (A+B); A = S16 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  164.     x = initS17 + (A+B); A = S17 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  165.     x = initS18 + (A+B); A = S18 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  166.     x = initS19 + (A+B); A = S19 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  167.     x = initS20 + (A+B); A = S20 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  168.     x = initS21 + (A+B); A = S21 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  169.     x = initS22 + (A+B); A = S22 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  170.     x = initS23 + (A+B); A = S23 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  171.     x = initS24 + (A+B); A = S24 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  172.     x = initS25 + (A+B); A = S25 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  173.  
  174.     x = S0  + (A+B); A = S0  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  175.     x = S1  + (A+B); A = S1  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  176.     x = S2  + (A+B); A = S2  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  177.     x = S3  + (A+B); A = S3  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  178.     x = S4  + (A+B); A = S4  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  179.     x = S5  + (A+B); A = S5  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  180.     x = S6  + (A+B); A = S6  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  181.     x = S7  + (A+B); A = S7  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  182.     x = S8  + (A+B); A = S8  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  183.     x = S9  + (A+B); A = S9  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  184.     x = S10 + (A+B); A = S10 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  185.     x = S11 + (A+B); A = S11 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  186.     x = S12 + (A+B); A = S12 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  187.     x = S13 + (A+B); A = S13 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  188.     x = S14 + (A+B); A = S14 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  189.     x = S15 + (A+B); A = S15 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  190.     x = S16 + (A+B); A = S16 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  191.     x = S17 + (A+B); A = S17 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  192.     x = S18 + (A+B); A = S18 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  193.     x = S19 + (A+B); A = S19 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  194.     x = S20 + (A+B); A = S20 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  195.     x = S21 + (A+B); A = S21 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  196.     x = S22 + (A+B); A = S22 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  197.     x = S23 + (A+B); A = S23 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  198.     x = S24 + (A+B); A = S24 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  199.     x = S25 + (A+B); A = S25 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  200.  
  201.     x = S0  + (A+B); A = S0  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  202.     x = S1  + (A+B); A = S1  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  203.     x = S2  + (A+B); A = S2  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  204.     x = S3  + (A+B); A = S3  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  205.     x = S4  + (A+B); A = S4  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  206.     x = S5  + (A+B); A = S5  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  207.     x = S6  + (A+B); A = S6  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  208.     x = S7  + (A+B); A = S7  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  209.     x = S8  + (A+B); A = S8  = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  210.     x = S9  + (A+B); A = S9  = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  211.     x = S10 + (A+B); A = S10 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  212.     x = S11 + (A+B); A = S11 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  213.     x = S12 + (A+B); A = S12 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  214.     x = S13 + (A+B); A = S13 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  215.     x = S14 + (A+B); A = S14 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  216.     x = S15 + (A+B); A = S15 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  217.     x = S16 + (A+B); A = S16 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  218.     x = S17 + (A+B); A = S17 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  219.     x = S18 + (A+B); A = S18 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  220.     x = S19 + (A+B); A = S19 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  221.     x = S20 + (A+B); A = S20 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  222.     x = S21 + (A+B); A = S21 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  223.     x = S22 + (A+B); A = S22 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  224.     x = S23 + (A+B); A = S23 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  225.     x = S24 + (A+B); A = S24 = (x << 3) | (x >>> 29); x = L0 + (A+B); y = (A+B) & (w-1); B = L0 = (x << y) | (x >>> (w-y));
  226.     x = S25 + (A+B); A = S25 = (x << 3) | (x >>> 29); x = L1 + (A+B); y = (A+B) & (w-1); B = L1 = (x << y) | (x >>> (w-y));
  227.   }
  228. }
  229.  
  230. // RC5 demo worker thread.
  231.  
  232. class RC5test implements Runnable {
  233.   RC5demo Host;
  234.  
  235.   RC5test(RC5demo host)
  236.   {
  237.     Host = host;
  238.   }
  239.  
  240.   public void run()
  241.   {
  242.     // cyphertext and iv data from the RSA test pseudo-contest "RSA-32/12/8-test"
  243.     long ct = 0x496def29b74be041L;
  244.     long iv = 0xc41f78c1f839a5d9L;
  245.     RC5 rc5 = new RC5_32_12_8();
  246.     byte[] key = new byte[rc5.keySize()];
  247.     // uncommenting these lines gives the correct key, we'll just start searching close to it
  248.     //key[0] = (byte)0x82;
  249.     //key[1] = (byte)0xe5;
  250.     //key[2] = (byte)0x1b;
  251.     key[3] = (byte)0x9f;
  252.     key[4] = (byte)0x9c;
  253.     key[5] = (byte)0xc7;
  254.     key[6] = (byte)0x18;
  255.     key[7] = (byte)0xf9;
  256.     long keys = 0;
  257.     long start = System.currentTimeMillis();
  258.     kloop: while (true) {
  259.       rc5.setup(key);
  260.       long pt = rc5.decrypt(ct) ^ iv;
  261.       keys++;
  262.       // this represents the string "The unkn"
  263.       if (pt == 0x6e6b6e7520656854L) {
  264.         // key has been found, but for this demo we'll keep searching
  265.         //break;
  266.       }
  267.       int i = 0;
  268.       while (++key[i] == 0) {
  269.         i++;
  270.         if (i >= 1) {
  271.           long now = System.currentTimeMillis();
  272.           // terminate the demo after a reasonable amount of time
  273.           if (now - start >= 30000) {
  274.             break kloop;
  275.           }
  276.           if (i >= 2) {
  277.             Host.updateStats(keys, now - start, false);
  278.           }
  279.         }
  280.         if (i >= key.length) {
  281.           break kloop;
  282.         }
  283.       }
  284.     }
  285.     long end = System.currentTimeMillis();
  286.     Host.updateStats(keys, end - start, true);
  287.   }
  288. }
  289.  

回复 "RC5算法"

这儿你可以回复上面这条便签

captcha