java改端技术

更好的AES加密

时间:2023-05-09 13:50:43   作者:ZeroMS   来源:冒险岛攻略网   阅读:154   评论:0
内容摘要:你好,这个下面是使用bouncycastle和方法重命名的奥丁aes加密的重写,所以不需要下载jce策略并复制它,只需获得bouncycastlejar就可以了让我知道如果以下可以进一步改进这也是基于v144感谢@Diamondo25在mapleshark的整洁版本该文件是OdinMSMapleStoryServer的...
你好,这个下面是使用bouncycastle和方法重命名的奥丁aes加密的重写,所以不需要下载jce策略并复制它,只需获得bouncycastle jar就可以了让我知道如果以下可以进一步改进这也是基于v144

感谢@ Diamondo25在mapleshark的整洁版本


该文件是OdinMS Maple Story Server的一部分    版权所有(C)2008 Patrick Huy <patrick.huy@frz.cc>               Matthias Butz <matze@odinms.de>               Jan Christian Meyer <vimes@odinms.de>    这个程序是免费的软件:你可以重新分配和/或修改    它根据GNU Affero General Public License的条款    由自由软件基金会第3版发布,由公布    自由软件基金会。您不得使用,修改或分发    这个程序在任何其他版本的GNU Affero General Public下    执照。    这个程序是分发的,希望它会有用,    但没有任何担保; 甚至没有暗示的保证    适销性或针对特定用途的适用性。看到了    GNU Affero通用公共许可证获取更多详细信息。    您应该收到GNU Affero General Public License的副本    随着这个程序。如果没有,请参阅<http://www.gnu.org/licenses/>。* /包装工具


  1. import java.security.InvalidKeyException;
  2. import java.security.Key;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.NoSuchProviderException;
  5. import java.security.Security;
  6. import javax.crypto.BadPaddingException;
  7. import javax.crypto.Cipher;
  8. import javax.crypto.IllegalBlockSizeException;
  9. import javax.crypto.NoSuchPaddingException;
  10. import javax.crypto.spec.SecretKeySpec;
  11. import org.bouncycastle.jce.provider.BouncyCastleProvider;
  12. import sun.security.provider.SecureRandom;
  13. / *
  14. * @作者Frz
  15. * @作者Multo
  16. *
  17. * /
  18. 公共类MapleAESOFB {
  19.     私人字节iv [];
  20.     私人密码密码;
  21.     私人短mapleVersion;
  22.     私有静态最终字节[] secretKey = {
  23.                0x46,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  24.                0x3C,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  25.                0xA3,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  26.                0xB6,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  27.                0x2F,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  28.                0xAE,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  29.                0x57,(字节)0x00,(字节)0x00,(字节)0x00,(字节)
  30.                0xB7,(字节)0x00,(字节)0x00,(字节)0x00};
  31.    
  32.     私有静态最终字节[] shuffleKey = {(字节)0xEC,(字节)0x3F,(字节)0x77,(字节)0xA4,(字节)0x45,(字节)0xD0,(字节)0x71(字节)0xBF,(字节)0xB7,(字节)0x98,(字节)0x20,(字节)0xFC,
  33.         (字节)0x4B,(字节)0xE9,(字节)0xB3,(字节)0xE1,(字节)0x5C,(字节)0x22,(字节)0xF7(字节)0x0C,(字节)0x44,(字节)0x1B, (字节)0x81,(字节)0xBD,(字节)0x63,(字节)0x8D,(字节)0xD4,(字节)0xC3,
  34.         (字节)0xF2,(字节)0x10,(字节)0x19,(字节)0xE0,(字节)0xFB,(字节)0xA1,(字节)0x6E,(字节)0x66(字节)0xEA,(字节)0xAE, (字节)0xD6,(字节)0xCE,(字节)0x06,(字节)0x18,(字节)0x4E,(字节)0xEB,
  35.         (字节)0x78,(字节)0x95,(字节)0xDB,(字节)0xBA,(字节)0xB6,(字节)0x42,(字节)0x7A,(字节)0x2A,(字节)0x83,(字节)0x0B, (字节)0x54,(字节)0x67,(字节)0x6D,(字节)0xE8,(字节)0x65,(字节)0xE7,
  36.         (字节)0x2F,(字节)0x07,(字节)0xF3,(字节)0xAA,(字节)0x27,(字节)0x7B,(字节)0x85,(字节)0xB0,(字节)0x26,(字节)0xFD, (字节)0x8B,(字节)0xA9,(字节)0xFA,(字节)0xBE,(字节)0xA8,(字节)0xD7,
  37.         (字节)0xCB,(字节)0xCC,(字节)0x92,(字节)0xDA,(字节)0xF9,(字节)0x93,(字节)0x60(字节)0x2D,(字节)0xDD,(字节)0xD2, (字节)0xA2,(字节)0x9B,(字节)0x39,(字节)0x5F,(字节)0x82,(字节)0x21,
  38.         (字节)0x4C,(字节)0x69,(字节)0xF8,(字节)0x31,(字节)0x87,(字节)0xEE,(字节)0x8E,(字节)0xAD,(字节)0x8C(字节)0x6A, (字节)0xBC,(字节)0xB5,(字节)0x6B,(字节)0x59,(字节)0x13,(字节)0xF1,
  39.         (字节)0x04,(字节)0x00,(字节)0xF6,(字节)0x5A,(字节)0x35,(字节)0x79,(字节)0x48,(字节)0x8F,(字节)0x15, (字节)0x97,(字节)0x57,(字节)0x12,(字节)0x3E,(字节)0x37,(字节)0xFF,
  40.         (字节)0x9D,(字节)0x4F,(字节)0x51,(字节)0xF5,(字节)0xA3,(字节)0x70,(字节)0xBB,(字节)0x14,(字节)0x75(字节)0xC2, (字节)0xB8,(字节)0x72,(字节)0xC0,(字节)0xED,(字节)0x7D,(字节)0x68,
  41.         (字节)0xC9,(字节)0x2E,(字节)0x0D,(字节)0x62,(字节)0x46,(字节)0x17,(字节)0x11,(字节)0x4D,(字节)0x6C,(字节)0xC4, (字节)0x7E,(字节)0x53,(字节)0xC1,(字节)0x25,(字节)0xC7,(字节)0x9A,
  42.         (字节)0x1C,(字节)0x88,(字节)0x58,(字节)0x2C,(字节)0x89,(字节)0xDC,(字节)0x02,(字节)0x64,(字节)0x40, (字节)0x5D,(字节)0x38,(字节)0xA5,(字节)0xE2,(字节)0xAF,(字节)0x55,
  43.         (字节)0xD5,(字节)0xEF,(字节)0x1A,(字节)0x7C,(字节)0xA7,(字节)0x5B,(字节)0xA6,(字节)0x6F,(字节)0x86,(字节)0x9F, (字节)0x73,(字节)0xE6,(字节)0x0A,(字节)0xDE,(字节)0x2B,(字节)0x99,
  44.         (字节)0x4A,(字节)0x47,(字节)0x9C,(字节)0xDF,(字节)0x09,(字节)0x76,(字节)0x9E,(字节)0x30,(字节)0x0E,(字节)0xE4, (字节)0xB2,(字节)0x94,(字节)0xA0,(字节)0x3B,(字节)0x34,(字节)0x1D,
  45.         (字节)0x28,(字节)0x0F,(字节)0x36,(字节)0xE3,(字节)0x23,(字节)0xB4,(字节)0x03,(字节)0xD8,(字节)0x90(字节)0xC8, (字节)0x3C,(字节)0xFE,(字节)0x5E,(字节)0x32,(字节)0x24,(字节)0x50,
  46.         (字节)0x1F,(字节)0x3A,(字节)0x43,(字节)0x8A,(字节)0x96,(字节)0x41,(字节)0x74,(字节)0xAC,(字节)0x52(字节)0x33, (字节)0xF0,(字节)0xD9,(字节)0x29,(字节)0x80,(字节)0xB1,(字节)0x16,
  47.         (字节)0xD3,(字节)0xAB,(字节)0x91,(字节)0xB9,(字节)0x84,(字节)0x7F,(字节)0x61(字节)0x1E,(字节)0xCF,(字节)0xC5, (字节)0xD1,(字节)0x56,(字节)0x3D,(字节)0xCA,(字节)0xF4,(字节)0x05,
  48.         (字节)0xC6,(字节)0xE5,(字节)0x08,(字节)0x49};
  49.     public MapleAESOFB(byte iv [],short mapleVersion){
  50.             Key pKey = new SecretKeySpec(secretKey,“AES”);
  51.             SecureRandom pRandom = new SecureRandom();
  52.             pRandom.engineNextBytes(IV);
  53.             Security.addProvider(new BouncyCastleProvider());
  54.             尝试{
  55.                 cipher = Cipher.getInstance(“AES / OFB / NoPadding”,“BC”);
  56.                 cipher.init(Cipher.ENCRYPT_MODE,pKey);
  57.             } catch(NoSuchAlgorithmException e){
  58.                 e.printStackTrace();
  59.             } catch(NoSuchProviderException e){
  60.                 e.printStackTrace();
  61.             } catch(NoSuchPaddingException e){
  62.                 e.printStackTrace();
  63.             } catch(InvalidKeyException e){
  64.                 e.printStackTrace();
  65.             }
  66.             this.setIv(IV);
  67.             this.mapleVersion =(short)(((mapleVersion >> 8)&0xFF)|((mapleVersion << 8)&0xFF00));
  68.     }
  69.     private void setIv(byte [] iv){
  70.         this.iv = iv;
  71.     }
  72.     private static byte [] multiplyBytes(byte [] in,int count,int mul){
  73.         byte [] ret = new byte [count * mul];
  74.         for(int x = 0; x <count * mul; x ++){
  75.             ret [x] = in [x%count];
  76.         }
  77.         返回ret;
  78.     }
  79.     public byte [] crypt(byte [] data){
  80.         int remaining = data.length;
  81.         int llength = 0x5B0;
  82.         int start = 0;
  83.         while(剩余> 0){
  84.             byte [] myIv = multiplyBytes(this.iv,4,4);
  85.             如果(剩余<llength){
  86.                 llength =剩余;
  87.             }
  88.             for(int x = start; x <(start + llength); x ++){
  89.                 if((x  -  start)%myIv.length == 0){
  90.                     尝试{
  91.                         byte [] newIv = cipher.doFinal(myIv);
  92.                         for(int j = 0; j <myIv.length; j ++){
  93.                             myIv [j] = newIv [j];
  94.                         }
  95.                     catch(IllegalBlockSizeException e){
  96.                     } catch(BadPaddingException e){
  97.                     }
  98.                 }
  99.                 data [x] ^ = myIv [(x-start)%myIv.length];
  100.             }
  101.             start + = llength;
  102.             剩余 -  = llength;
  103.             llength = 0x5B4;
  104.         }
  105.         updateIv();
  106.         返回数据;
  107.     }
  108.     私人无效updateIv(){
  109.         this.iv = getNewIv(this.iv);
  110.     }
  111.     public byte [] getPacketHeader(int length){
  112.         int iiv =(iv [3])&0xFF;
  113.         iiv | =(iv [2] << 8)&0xFF00;
  114.         iiv ^ = mapleVersion;
  115.         int mlength =((length << 8)&0xFF00)| (长度>>> 8);
  116.         int xoredIv = iiv ^ mlength;
  117.         byte [] ret =新字节[4];
  118.         ret [0] =(byte)((iiv >>> 8)&0xFF);
  119.         ret [1] =(byte)(iiv&0xFF);
  120.         ret [2] =(byte)((xoredIv >>> 8)&0xFF);
  121.         ret [3] =(byte)(xoredIv&0xFF);
  122.         返回ret;
  123.     }
  124.     public static int getPacketLength(int packetHeader){
  125.         int packetLength =((packetHeader >>> 16)^(packetHeader&0xFFFF));
  126.         packetLength =((packetLength << 8)&0xFF00)| ((packetLength >>> 8)&0xFF);
  127.         返回packetLength;
  128.     }
  129.     public boolean checkPacket(byte [] packet){
  130.         (((packet [0] ^ iv [2])&0xFF)==((mapleVersion >> 8)&0xFF))&&(((packet [1] ^ iv [3])&0xFF)== (mapleVersion&0xFF)));
  131.     }
  132.     public boolean checkPacket(int packetHeader){
  133.         byte packetHeaderBuf [] = new byte [2];
  134.         packetHeaderBuf [0] =(byte)((packetHeader >> 24)&0xFF);
  135.         packetHeaderBuf [1] =(byte)((packetHeader >> 16)&0xFF);
  136.         返回checkPacket(packetHeaderBuf);
  137.     }
  138.     public static byte [] getNewIv(byte oldIv []){
  139.         byte [] newIv = {(byte)0xf2,0x53,(byte)0x50,(byte)0xc6};
  140.         for(int x = 0; x <4; x ++){
  141.             随机播放(oldIv [x],newIv);
  142.         }
  143.         返回newIv;
  144.     }
  145.         
  146.    private static byte [] Shuffle(byte inputValue,byte [] pIv){
  147.          字节输入= inputValue;
  148.          byte tableInput = shuffleKey [input];
  149.          pIv [0] + =(byte)(shuffleKey [pIv [1]]  -  input);
  150.          pIv [1]  -  =(byte)(pIv [2] ^ tableInput);
  151.          pIv [2] ^ =(字节)(shuffleKey [pIv [3]] +输入);
  152.          pIv [3]  -  =(byte)(pIv [0]  -  tableInput);
  153.          
  154.          int Value =(int)(pIv [0])&0xFF | (pIv [1] << 8)&0xFF00 | (pIv [2] << 16)&0xFF0000 | (pIv [3] << 24)&0xFF000000;
  155.          值=(值>> 0x1D |值<< 0x03);
  156.          
  157.          pIv [0] =(byte)(Value&0xFF);
  158.          pIv [1] =(byte)((Value >> 8)&0xFF);
  159.          pIv [2] =(byte)((Value >> 16)&0xFF);
  160.          pIv [3] =(byte)((Value >> 24)&0xFF);
  161.         
  162.          返回pIv;
  163.          
  164.     }
  165. }


标签:好的  更好  加密  更好的  
相关评论

欢迎加入全国最大的冒险岛攻略交流社区,在这里你可以找到丰富的冒险资源,同时更有众多群友和你一起交流分享心得

《冒险岛Online》是一款超人气家庭休闲网游。整个游戏画面以2D平面展开,采用了与其他Q版2D游戏不同的横向卷轴的移动方式。
游戏场景高低落差的设计,整个画面分前景、静止背景、活动景物3个层次的设计,既别出心裁又给人一种很真实的感受。

声明:本站文章均来此网络,如有侵权请来信告知!我们将在24小时内删除!本站为冒险岛交流区,请支持冒险岛官方,官方网站:mxd.sdo.com

Copyright © 2008 - 2025 盗贼冒险岛. All Rights Reserved