安卓逆向 -- 自吐算法(3DES和AES)

一、3DES源码

String bs= "逆向有你a";DESedeKeySpec des3key = new DESedeKeySpec(("123456781234567812345678".getBytes(StandardCharsets.UTF_8)));//密钥必须是24个字节SecretKeyFactory keydes3 = SecretKeyFactory.getInstance("DESede");SecretKey secretKey3 = keydes3.generateSecret(des3key);Cipher cipher3des = Cipher.getInstance("DESede/ECB/PKCS5Padding");cipher3des.init(1,secretKey3);byte[] des3res = cipher3des.doFinal(bs.getBytes(StandardCharsets.UTF_8));System.out.println("3DES加密(字节):"+Arrays.toString(des3res));System.out.println("3DES加密(Hex):"+bytes2HexString(des3res));System.out.println("3DES加密(Base64):"+Base64.getEncoder().encodeToString(des3res));cipher3des.init(2,secretKey3);//初始化解密byte[] jm3desres = cipher3des.doFinal(Base64.getDecoder().decode("vN3o+PDQ0Yo8y5+InEzpwA==".getBytes(StandardCharsets.UTF_8)));System.out.println("3DES解密(Base64):"+new String(jm3desres));byte[] des3hexbyte =hexString2Bytes("BCDDE8F8F0D0D18A3CCB9F889C4CE9C0");jm3desres=cipher3des.doFinal(des3hexbyte);System.out.println("3DES解密(Hex):"+new String(jm3desres));

二、分析源码,需hook的内容

3DES除了key和DES有区别外,其他的iv向量和dofinal都一样,所以只要hook类javax.crypto.spec.DESedeKeySpec就可以了

三、hook源码

XposedBridge.hookAllConstructors(XposedHelpers.findClass(        "javax.crypto.spec.DESedeKeySpec",        loadPackageParam.classLoader),        new XC_MethodHook() {            /* access modifiers changed from: protected */            public void beforeHookedMethod(XC_MethodHook.MethodHookParam param) throws Throwable {                Log.e("逆向有你", "Stack:", new Throwable("stack dump"));                byte[] keybyte = new byte[24];                int offset = 0;                if (param.args.length != 1) {                    offset = ((Integer) param.args[1]).intValue();                }                System.arraycopy((byte[]) param.args[0], offset, keybyte, 0, 24);                String keyHex = b2s(keybyte);                String keyB64 = Base64.encodeToString(keybyte, 0);                Log.d("逆向有你", "3DESKey:" + new String(keybyte));                Log.d("逆向有你", "3DESKeyHex:" + keyHex);                Log.d("逆向有你", "3DESKeyB64:" + keyB64);                Log.d("逆向有你", "=====================3DESKey=========================");            }        });

四、AES算法源码

String bs= "逆向有你a";SecretKeySpec aeskey = new SecretKeySpec("1234567812345678".getBytes(StandardCharsets.UTF_8),"AES");//获取密钥的实例IvParameterSpec aesiv = new IvParameterSpec("1234567812345678".getBytes(StandardCharsets.UTF_8));//获取IV向量的实例Cipher aescp = Cipher.getInstance("AES/CBC/PKCS5Padding");//告诉系统加密模式还有填充方式aescp.init(1,aeskey,aesiv);//初始化加密方法byte[] aesres = aescp.doFinal(bs.getBytes(StandardCharsets.UTF_8));//使用dofinal加密System.out.println("aes加密(字节):"+Arrays.toString(aesres));System.out.println("aes加密(Hex):"+bytes2HexString(aesres));System.out.println("aes加密(Base64):"+Base64.getEncoder().encodeToString(aesres));aescp.init(2,aeskey,aesiv);//初始化解密byte[] jmaesres = aescp.doFinal(Base64.getDecoder().decode("MEpgbtD9muLvf6krtX86Og==".getBytes(StandardCharsets.UTF_8)));System.out.println("aes解密(Base64):"+new String(jmaesres));byte[] jmhexbyte =hexString2Bytes("304A606ED0FD9AE2EF7FA92BB57F3A3A");jmhexbyte=aescp.doFinal(jmhexbyte);System.out.println("aes解密(Hex):"+new String(jmhexbyte));

禁止非法,后果自负

欢迎关注公众号:逆向有你

欢迎关注视频号:之乎者也吧

图片

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称。它相当于是对每个数据块应用三次DES加密算法。 最早的定义了该算法的标准(ANS X9.52,1998年发布)将其描述为“三重数据加密算法(TDEA)”— 即为ANSI X3.92中定义的数据加密算法(DEA)的三次重复操作— 而完全没有使用术语“3DES”或“DES”。FIPS PUB 46-3(1999)定义了“三重数据加密算法”(TDEA),也使用了术语“Triple DES”和“DES”。该标准中互换的使用“数据加密算法”(DEA)和“DES”的概念,其中以此开始DES的定义: 数据加密标准(DES)应当包括下文中的数据加密算法(DES[4])与三重数据加密算法(TDEA,如ANSI X9.52中所描述的) NIST SP 800-67(2004,2008[5])主要使用术语TDEA,但也提到了“Triple DES(TDEA)”。ISO/IEC 18033-3(2005)使用“TDEA”,但其中提到: TDEA通称Triple DES(数据加密标准)。 没有一个定义了本算法的标准使用术语“3DES”。 3DESughhhg34465345556555678==算法== 3DES使用“密钥包”,其包含3个DES密钥,K1,K2和K3,均为56位(除去奇偶校验位)。加密算法为: 密文 = EK3(DK2(EK1(平文))) 也就是说,使用K1为密钥进行DES加密,再用K2为密钥进行DES“解密”,最后以K3进行DES加密。 而解密则为其反过程: 平文 = DK1(EK2(DK3(密文))) 即以K3解密,以K2“加密”,最后以K1解密。 每次加密操作都只处理64位数据,称为一块。 无论是加密还是解密,中间一步都是前后两步的逆。这种做法提高了使用密钥选项2时的算法强度,并在使用密钥选项3时与DES兼容。 密钥选项[编辑] 标准定义了三种密钥选项: 密钥选项1:三个密钥是独立的。 密钥选项2:K1和K2是独立的,而K3=K1 密钥选项3:三个密钥均相等,即K1=K2=K3 密钥选项1的强度最高,拥有3 x 56 = 168个独立的密钥位。 密钥选项2的安全性稍低,拥有2 x 56 = 112个独立的密钥位。该选项比简单的应用DES两次的强度较高,即使用K1和K2,因为它可以防御中途相遇攻击。 密钥选项3等同与DES,只有56个密钥位。这个选项提供了与DES的兼容性,因为第1和第2次DES操作相互抵消了。该选项不再为国家标准科技协会(NIST)所建议[6],亦不为ISO/IEC 18033-3所支持。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

web安全工具库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值