Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 354|回复: 0

[算法学习]IDEA加密算法源码(java版)

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2014-11-6 00:03:23 | 显示全部楼层 |阅读模式
    1. 来源:http://blog.csdn.net/zyg158/archive/2007/06/26/1667531.aspx
    2.                         
    3. public class IDEA {
    4.     private byte[] Encrypt(byte[] bytekey, byte[] inputBytes, boolean flag) {
    5.         byte[] encryptCode = new byte[8];
    6.         // 分解子密钥
    7.         int[] key = get_subkey(flag, bytekey);
    8.         // 进行加密操作
    9.         encrypt(key, inputBytes, encryptCode);
    10.         // 返回加密数据
    11.         return encryptCode;
    12.     }

    13.     private int bytesToInt(byte[] inBytes, int startPos) {
    14.         return ((inBytes[startPos] << 8) & 0xff00) +
    15.         (inBytes[startPos + 1] & 0xff);
    16.     }

    17.     private void intToBytes(int inputInt, byte[] outBytes, int startPos) {
    18.         outBytes[startPos] = (byte) (inputInt >>> 8);
    19.         outBytes[startPos + 1] = (byte) inputInt;
    20.     }

    21.     private int x_multiply_y(int x, int y) {
    22.         if (x == 0) {
    23.             x = 0x10001 - y;
    24.         } else if (y == 0) {
    25.             x = 0x10001 - x;
    26.         } else {
    27.             int tmp = x * y;
    28.             y = tmp & 0xffff;
    29.             x = tmp >>> 16;
    30.             x = (y - x) + ((y < x) ? 1 : 0);
    31.         }
    32.         return x & 0xffff;
    33.     }

    34.     private void encrypt(int[] key, byte[] inbytes, byte[] outbytes) {
    35.         int k = 0;
    36.         int a = bytesToInt(inbytes, 0);
    37.         int b = bytesToInt(inbytes, 2);
    38.         int c = bytesToInt(inbytes, 4);
    39.         int d = bytesToInt(inbytes, 6);
    40.         for (int i = 0; i < 8; i++) {
    41.             a = x_multiply_y(a, key[k++]);
    42.             b += key[k++];
    43.             b &= 0xffff;
    44.             c += key[k++];
    45.             c &= 0xffff;
    46.             d = x_multiply_y(d, key[k++]);
    47.             int tmp1 = b;
    48.             int tmp2 = c;
    49.             c ^= a;
    50.             b ^= d;
    51.             c = x_multiply_y(c, key[k++]);
    52.             b += c;
    53.             b &= 0xffff;
    54.             b = x_multiply_y(b, key[k++]);
    55.             c += b;
    56.             c &= 0xffff;
    57.             a ^= b;
    58.             d ^= c;
    59.             b ^= tmp2;
    60.             c ^= tmp1;
    61.         }
    62.         intToBytes(x_multiply_y(a, key[k++]), outbytes, 0);
    63.         intToBytes(c + key[k++], outbytes, 2);
    64.         intToBytes(b + key[k++], outbytes, 4);
    65.         intToBytes(x_multiply_y(d, key[k]), outbytes, 6);
    66.     }

    67.     private int[] encrypt_subkey(byte[] byteKey) {
    68.         int[] key = new int[52];
    69.         if (byteKey.length < 16) {
    70.             byte[] tmpkey = new byte[16];
    71.             System.arraycopy(byteKey, 0, tmpkey,
    72.                 tmpkey.length - byteKey.length, byteKey.length);
    73.             byteKey = tmpkey;
    74.         }
    75.         for (int i = 0; i < 8; i++) {
    76.             key[i] = bytesToInt(byteKey, i * 2);
    77.         }
    78.         for (int j = 8; j < 52; j++) {
    79.             if ((j & 0x7) < 6) {
    80.                 key[j] = (((key[j - 7] & 0x7f) << 9) | (key[j - 6] >> 7)) &
    81.                     0xffff;
    82.             } else if ((j & 0x7) == 6) {
    83.                 key[j] = (((key[j - 7] & 0x7f) << 9) | (key[j - 14] >> 7)) &
    84.                     0xffff;
    85.             } else {
    86.                 key[j] = (((key[j - 15] & 0x7f) << 9) | (key[j - 14] >> 7)) &
    87.                     0xffff;
    88.             }
    89.         }
    90.         return key;
    91.     }

    92.     private int fun_a(int a) {
    93.         if (a < 2) {
    94.             return a;
    95.         }
    96.         int b = 1;
    97.         int c = 0x10001 / a;
    98.         for (int i = 0x10001 % a; i != 1;) {
    99.             int d = a / i;
    100.             a %= i;
    101.             b = (b + (c * d)) & 0xffff;
    102.             if (a == 1) {
    103.                 return b;
    104.             }
    105.             d = i / a;
    106.             i %= a;
    107.             c = (c + (b * d)) & 0xffff;
    108.         }
    109.         return (1 - c) & 0xffff;
    110.     }
    111.     private int fun_b(int b) {
    112.         return (0 - b) & 0xffff;
    113.     }
    114.     private int[] uncrypt_subkey(int[] key) {
    115.         int dec = 52;
    116.         int asc = 0;
    117.         int[] unkey = new int[52];
    118.         int aa = fun_a(key[asc++]);
    119.         int bb = fun_b(key[asc++]);
    120.         int cc = fun_b(key[asc++]);
    121.         int dd = fun_a(key[asc++]);
    122.         unkey[--dec] = dd;
    123.         unkey[--dec] = cc;
    124.         unkey[--dec] = bb;
    125.         unkey[--dec] = aa;
    126.         for (int k1 = 1; k1 < 8; k1++) {
    127.             aa = key[asc++];
    128.             bb = key[asc++];
    129.             unkey[--dec] = bb;
    130.             unkey[--dec] = aa;
    131.             aa = fun_a(key[asc++]);
    132.             bb = fun_b(key[asc++]);
    133.             cc = fun_b(key[asc++]);
    134.             dd = fun_a(key[asc++]);
    135.             unkey[--dec] = dd;
    136.             unkey[--dec] = bb;
    137.             unkey[--dec] = cc;
    138.             unkey[--dec] = aa;
    139.         }
    140.         aa = key[asc++];
    141.         bb = key[asc++];
    142.         unkey[--dec] = bb;
    143.         unkey[--dec] = aa;
    144.         aa = fun_a(key[asc++]);
    145.         bb = fun_b(key[asc++]);
    146.         cc = fun_b(key[asc++]);
    147.         dd = fun_a(key[asc]);
    148.         unkey[--dec] = dd;
    149.         unkey[--dec] = cc;
    150.         unkey[--dec] = bb;
    151.         unkey[--dec] = aa;
    152.         return unkey;
    153.     }
    154.     private int[] get_subkey(boolean flag, byte[] bytekey) {
    155.         if (flag) {
    156.             return encrypt_subkey(bytekey);
    157.         } else {
    158.             return uncrypt_subkey(encrypt_subkey(bytekey));
    159.         }
    160.     }
    161.     private byte[] ByteDataFormat(byte[] data, int unit) {
    162.         int len = data.length;
    163.         int padlen = unit - (len % unit);
    164.         int newlen = len + padlen;
    165.         byte[] newdata = new byte[newlen];
    166.         System.arraycopy(data, 0, newdata, 0, len);
    167.         for (int i = len; i < newlen; i++)
    168.             newdata[i] = (byte) padlen;
    169.         return newdata;
    170.     }
    171.     public byte[] IdeaEncrypt(byte[] idea_key, byte[] idea_data, boolean flag) {
    172.         byte[] format_key = ByteDataFormat(idea_key, 16);
    173.         byte[] format_data = ByteDataFormat(idea_data, 8);
    174.         int datalen = format_data.length;
    175.         int unitcount = datalen / 8;
    176.         byte[] result_data = new byte[datalen];
    177.         for (int i = 0; i < unitcount; i++) {
    178.             byte[] tmpkey = new byte[16];
    179.             byte[] tmpdata = new byte[8];
    180.             System.arraycopy(format_key, 0, tmpkey, 0, 16);
    181.             System.arraycopy(format_data, i * 8, tmpdata, 0, 8);
    182.             byte[] tmpresult = Encrypt(tmpkey, tmpdata, flag);
    183.             System.arraycopy(tmpresult, 0, result_data, i * 8, 8);
    184.         }
    185.         return result_data;
    186.     }
    187.     public static void main(String[] args) {
    188.         String key = "0000000000000000";
    189.         String data = "11111111";
    190.         byte[] bytekey = key.getBytes();
    191.         byte[] bytedata = data.getBytes();
    192.         IDEA idea = new IDEA();
    193.         byte[] encryptdata = idea.IdeaEncrypt(bytekey, bytedata, true);
    194.         byte[] decryptdata = idea.IdeaEncrypt(bytekey, encryptdata, false);
    195.         System.out.println("--------------------------------");
    196.         for (int i = 0; i < bytedata.length; i++) {
    197.             System.out.print(" " + bytedata[i] + " ");
    198.         }
    199.         System.out.println();
    200.         System.out.println("-----------------------------------");
    201.         for (int i = 0; i < encryptdata.length; i++) {
    202.             System.out.print(" " + encryptdata[i] + " ");
    203.         }
    204.         System.out.println();
    205.         System.out.println("-------------------------------");
    206.         for (int i = 0; i < decryptdata.length; i++) {
    207.             System.out.print(" " + decryptdata[i] + " ");
    208.         }
    209.         System.out.println("");
    210.         System.out.println("--------------------------------");
    211.     }
    212. }

    213. 运行结果:

    214. C:        est>java    IDEA
    215. -------------------------------------------------------------------------
    216. 49  49  49  49  49  49  49  49
    217. ----------------------------------------------------------------------------------
    218. 72  -105  45  2  -44  -122  122  21  32  9  89  -75  19  28  -62  88
    219. ------------------------------------------------------------------------------------------------
    220. 49  49  49  49  49  49  49  49  8  8  8  8  8  8  8  8  -83  -31  -57  -13  24  -31  -113  25
    221. ----------------------------------------------------------------------------------------------------------
    222.                      
    复制代码

       
         
         
          
          

            
          

            
          
         
       

      


    源码下载:http://file.javaxxz.com/2014/11/6/000323234.zip
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2025-2-25 11:15 , Processed in 0.299594 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表