递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 4072|回复: 7
打印 上一主题 下一主题

[安卓] 请教安卓版AES-ECB加密输出结果错误

[复制链接]

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
跳转到指定楼层
楼主
发表于 2023-5-19 12:46:40 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
安卓版AES-ECB加密和PC版输出结果不一样怎么回事,也和其它在线加密不一样,均已转换16进制文本相比较的。明文:“12345678”,密钥:“1234567812345678”,pc版的正确,安卓版就不对,想不通了,请大神赐教!
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
沙发
 楼主| 发表于 2023-5-19 12:50:02 来自手机 | 只看该作者
第一张为电脑版,第二张安卓版
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
板凳
 楼主| 发表于 2023-5-19 12:52:29 来自手机 | 只看该作者
黑色毛嗑儿 发表于 2023-5-19 12:50
第一张为电脑版,第二张安卓版

图片怎么传不上去
回复

使用道具 举报

31

主题

211

帖子

1950

积分

金牌会员

Rank: 6Rank: 6

积分
1950
地板
发表于 2023-5-19 20:56:53 | 只看该作者
  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 类 AES加解密通用类 <公开 注释 = "★ 本类由"飞翔的企鹅"封装.">
  3. {
  4.     方法 加密 <公开 静态 类型 = 文本型 注释 = "AES是一种对称加密方法,即:加解密过程中使用相同的一个密码(密钥)来进行."
  5.             返回值注释 = "返回加密后的数据,如果加密失败或提供所需参数不正确将返回空对象." 返回值注释 = "注意:返回的结果是使用Base64编码后的结果." @禁止流程检查 = 真>
  6.     参数 欲加密数据 <类型 = 文本型 注释 = "提供所欲加密的数据.">
  7.     参数 密码 <类型 = 文本型 注释 = "提供所欲使用的密码文本." 注释 = "注意:该方法并未使用强随机种子算法处理密钥,即所提供的密码必须是以下长度(如非以下长度将加密失败):"
  8.             注释 = "16字节,24字节或32字节长度.">
  9.     参数 偏移 <类型 = 文本型 注释 = "提供加密欲使用的偏移数据,ECB模式无需偏移." @默认值 = 空对象>
  10.     参数 模式及填充方式 <类型 = 文本型 注释 = "注意:此处如果不懂填充模式以及加密模式的请保持该参数默认值."
  11.             注释 = "如果格式提供不正确(或与加密方法使用的不一致)将无法正常解密,请严格按照以下列举出的模式进行本参数的提供."
  12.             注释 = "参数格式形如(ECB加密模式无填充):"ECB/NoPadding"." 注释 = "加密模式/填充方式  支持所需的API等级"
  13.             注释 = ""CBC/ISO10126Padding"  API1+" 注释 = ""CBC/NoPadding"  API1+"
  14.             注释 = ""CBC/PKCS5Padding"  API1+" 注释 = "" 注释 = ""CFB/ISO10126Padding"  API1+"
  15.             注释 = ""CFB/NoPadding"  API1+" 注释 = ""CFB/PKCS5Padding"  API1+" 注释 = ""
  16.             注释 = ""CTR/ISO10126Padding"  API1+" 注释 = ""CTR/NoPadding"  API1+"
  17.             注释 = ""CTR/PKCS5Padding"  API1+" 注释 = "" 注释 = ""CTS/ISO10126Padding"  API1+"
  18.             注释 = ""CTS/NoPadding"  API1+" 注释 = ""CTS/PKCS5Padding"  API1+" 注释 = ""
  19.             注释 = ""ECB/ISO10126Padding"  API1+" 注释 = ""ECB/NoPadding"  API1+"
  20.             注释 = ""ECB/PKCS5Padding"  API1+" 注释 = "" 注释 = ""OFB/ISO10126Padding"  API1+"
  21.             注释 = ""OFB/NoPadding"  API1+" 注释 = ""OFB/PKCS5Padding"  API1+" 注释 = ""
  22.             注释 = ""GCM/NoPadding"  API10+" 折叠2 @默认值 = 空对象>
  23.     参数 编码类型 <类型 = 文本型 注释 = "加密结果所欲使用的编码类型." @默认值 = "UTF-8">
  24.     {
  25.         如果 (文本是否为空 (欲加密数据) || 密码 == 空对象 || 文本是否为空 (密码))
  26.         {
  27.             返回 (空对象)
  28.         }
  29.         变量 模式 <类型 = 文本型>
  30.         如果 (模式及填充方式 != 空对象 && 文本是否为空 (模式及填充方式) == 假)
  31.         {
  32.             模式 = "AES/" + 模式及填充方式
  33.         }
  34.         否则
  35.         {
  36.             模式 = "AES/ECB/NoPadding"
  37.         }
  38.         开始俘获异常 ()
  39.         {
  40.             @ javax.crypto.spec.SecretKeySpec secretKeySpec = new javax.crypto.spec.SecretKeySpec(@<密码>.getBytes(), "AES");
  41.             @ javax.crypto.spec.IvParameterSpec ivParameterSpec = new javax.crypto.spec.IvParameterSpec(@<偏移>.getBytes());
  42.             @ javax.crypto.Cipher instance = javax.crypto.Cipher.getInstance(@<模式>);
  43.             @ instance.init(1, secretKeySpec, ivParameterSpec);
  44.             @ return new String(android.util.Base64.encode(instance.doFinal(@<欲加密数据>.getBytes()), 2), @<编码类型>);
  45.         }
  46.         俘获所有异常 ()
  47.         {
  48.             返回 (空对象)
  49.         }
  50.     }

  51.     方法 解密 <公开 静态 类型 = 文本型 注释 = "AES是一种对称加密方法,即:加解密过程中使用相同的一个密码(密钥)来进行." @禁止流程检查 = 真>
  52.     参数 欲解密数据 <类型 = 文本型 注释 = "提供所欲解密的Base64编码数据.">
  53.     参数 密码 <类型 = 文本型 注释 = "提供所欲使用的密码文本." 注释 = "注意:该方法并未使用强随机种子算法处理密钥,即所提供的密码必须是以下长度(如非以下长度将解密失败):"
  54.             注释 = "16字节,24字节或32字节长度." 折叠2>
  55.     参数 偏移 <类型 = 文本型 注释 = "提供解密欲使用的偏移数据,ECB模式无需偏移." @默认值 = 空对象>
  56.     参数 模式及填充方式 <类型 = 文本型 注释 = "注意:此处如果不懂填充模式以及加密模式的请保持该参数默认值."
  57.             注释 = "如果格式提供不正确(或与加密方法使用的不一致)将无法正常解密,请严格按照以下列举出的模式进行本参数的提供."
  58.             注释 = "参数格式形如(ECB加密模式无填充):"ECB/NoPadding"." 注释 = "加密模式/填充方式  支持所需的API等级"
  59.             注释 = ""CBC/ISO10126Padding"  API1+" 注释 = ""CBC/NoPadding"  API1+"
  60.             注释 = ""CBC/PKCS5Padding"  API1+" 注释 = "" 注释 = ""CFB/ISO10126Padding"  API1+"
  61.             注释 = ""CFB/NoPadding"  API1+" 注释 = ""CFB/PKCS5Padding"  API1+" 注释 = ""
  62.             注释 = ""CTR/ISO10126Padding"  API1+" 注释 = ""CTR/NoPadding"  API1+"
  63.             注释 = ""CTR/PKCS5Padding"  API1+" 注释 = "" 注释 = ""CTS/ISO10126Padding"  API1+"
  64.             注释 = ""CTS/NoPadding"  API1+" 注释 = ""CTS/PKCS5Padding"  API1+" 注释 = ""
  65.             注释 = ""ECB/ISO10126Padding"  API1+" 注释 = ""ECB/NoPadding"  API1+"
  66.             注释 = ""ECB/PKCS5Padding"  API1+" 注释 = "" 注释 = ""OFB/ISO10126Padding"  API1+"
  67.             注释 = ""OFB/NoPadding"  API1+" 注释 = ""OFB/PKCS5Padding"  API1+" 注释 = ""
  68.             注释 = ""GCM/NoPadding"  API10+" 折叠2 @默认值 = 空对象>
  69.     参数 编码类型 <类型 = 文本型 注释 = "指定加密数据所使用的编码类型." @默认值 = "UTF-8">
  70.     {
  71.         如果 (文本是否为空 (欲解密数据) || 密码 == 空对象 || 文本是否为空 (密码))
  72.         {
  73.             返回 (空对象)
  74.         }
  75.         变量 模式 <类型 = 文本型>
  76.         如果 (模式及填充方式 != 空对象 && 文本是否为空 (模式及填充方式) == 假)
  77.         {
  78.             模式 = "AES/" + 模式及填充方式
  79.         }
  80.         否则
  81.         {
  82.             模式 = "AES/ECB/NoPadding"
  83.         }
  84.         开始俘获异常 ()
  85.         {
  86.             @ byte[] bytes = android.util.Base64.decode(@<欲解密数据>, 2);
  87.             @ javax.crypto.spec.SecretKeySpec secretKeySpec = new javax.crypto.spec.SecretKeySpec(@<密码>.getBytes(), "AES");
  88.             @ javax.crypto.spec.IvParameterSpec ivParameterSpec = new javax.crypto.spec.IvParameterSpec(@<偏移>.getBytes());
  89.             @ javax.crypto.Cipher instance = javax.crypto.Cipher.getInstance(@<模式>);
  90.             @ instance.init(2, secretKeySpec, ivParameterSpec);
  91.             @ return new String(instance.doFinal(bytes), @<编码类型>);
  92.         }
  93.         俘获所有异常 ()
  94.         {
  95.             返回 (空对象)
  96.         }
  97.     }
  98. }
复制代码


我记得有2个AES库,可以试一下,也可以复制这段试一下
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
5#
 楼主| 发表于 2023-5-22 20:46:03 来自手机 | 只看该作者
就是用的这个结果不对
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
6#
 楼主| 发表于 2023-5-27 19:14:04 来自手机 | 只看该作者
已经修复了,修改了封装的嵌入代码,已经可以正常显示结果了
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
7#
 楼主| 发表于 2023-5-28 10:17:29 来自手机 | 只看该作者
根据网上java代码修改了一下,ECB无偏移,所有移出了这个参数,稍后把源码发上来,大神给解释一下
回复

使用道具 举报

1

主题

56

帖子

495

积分

中级会员

Rank: 3Rank: 3

积分
495
8#
 楼主| 发表于 2023-5-28 13:40:49 | 只看该作者
类定义部分:

<火山程序 类型 = "通常" 版本 = 1 />

类 AES_ECB加密解密类 <公开>
{
    方法 加密 <公开 静态 类型 = "字节 []" 注释 = "AES是一种对称加密方法,即:加解密过程中使用相同的一个密码(密钥)来进行"
            返回值注释 = "返回加密后的数据,如果加密失败或提供所需参数不正确将返回空对象." @禁止流程检查 = 真>
    参数 欲加密数据 <类型 = 文本型 注释 = "提供所欲加密的数据.">
    参数 密码 <类型 = 文本型 注释 = "提供所欲使用的密码数据." 注释 = "注意:该方法并未使用强随机种子算法处理密钥,即所提供的密码必须是以下长度(如非以下长度将加密失败):"
            注释 = "16字节,24字节或32字节长度">
    参数 模式及填充方式 <类型 = 文本型 注释 = "注意:此处如果不懂填充模式以及加密模式的请保持该参数默认值."
            注释 = "如果格式提供不正确(或与加密方法使用的不一致)将无法正常解密,请严格按照以下列举出的模式进行本参数的提供." 注释 = "参数格式形如(ECB加密模式无填充):\"ECB/NoPadding\"." 注释 = "加密模式/填充方式  支持所需的API等级"
            @默认值 = 空对象>
    参数 编码类型 <类型 = 文本型 @默认值 = "UTF-8">
    {
        变量 返回数据 <类型 = "字节 []">
        变量 模式 <类型 = 文本型>

        如果 (欲加密数据 == 空对象 || 密码 == 空对象)
        {
            返回 (空对象)
        }
        否则
        {
            如果 (模式及填充方式 != 空对象 && 文本是否为空 (模式及填充方式) == 假)
            {
                模式 = "AES/" + 模式及填充方式
            }
            否则
            {
                模式 = "AES/ECB/NoPadding"
            }

            @ @m<RUN_E>(
            @      javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(@<模式>); //"算法/模式/补码方式"
            @      cipher.init(javax.crypto.Cipher.ENCRYPT_MODE, new javax.crypto.spec.SecretKeySpec(@<密码>.getBytes(@<编码类型>), "AES"));      
            @      @<返回数据> = cipher.doFinal(@<欲加密数据>.getBytes(@<编码类型>));
            @ )
            返回 (返回数据)
        }
    }

    #

    方法 解密 <公开 静态 类型 = 文本型 注释 = "AES是一种对称加密方法,即:加解密过程中使用相同的一个密码(密钥)来进行." 返回值注释 = "失败返回空对象" @禁止流程检查 = 真>
    参数 欲解密数据 <类型 = "字节 []" 注释 = "提供所欲解密的密码数据.">
    参数 密码 <类型 = 文本型 注释 = "提供所欲使用的密码数据." 注释 = "注意:该方法并未使用强随机种子算法处理密钥,即所提供的密码必须是以下长度(如非以下长度将解密失败):"
            注释 = "16字节,24字节或32字节长度.">
    参数 模式及填充方式 <类型 = 文本型 注释 = "注意:此处如果不懂填充模式以及加密模式的请保持该参数默认值."
            注释 = "如果格式提供不正确(或与加密方法使用的不一致)将无法正常解密,请严格按照以下列举出的模式进行本参数的提供."
            注释 = "参数格式形如(ECB加密模式无填充):\"ECB/NoPadding\"." 注释 = "加密模式/填充方式  支持所需的API等级"
             @默认值 = 空对象>
    参数 编码类型 <类型 = 文本型 @默认值 = "UTF-8">
    {
        变量 返回数据 <类型 = 文本型>
        变量 解码数据 <类型 = "字节[]">
        变量 原始数据 <类型 = "字节 []">
        变量 模式 <类型 = 文本型>

        如果 (欲解密数据 == 空对象 || 密码 == 空对象)
        {
            返回 (空对象)
        }
        否则
        {
            如果 (模式及填充方式 != 空对象 && 文本是否为空 (模式及填充方式) == 假)
            {
                模式 = "AES/" + 模式及填充方式
            }
            否则
            {
                模式 = "AES/ECB/NoPadding"
            }
            @ @m<RUN_E>(
            @       javax.crypto.Cipher cipher = javax.crypto.Cipher.getInstance(@<模式>); //"算法/模式/补码方式"
            @       cipher.init(javax.crypto.Cipher.DECRYPT_MODE, new javax.crypto.spec.SecretKeySpec(@<密码>.getBytes(@<编码类型>), "AES"));
            @       @<解码数据> = android.util.Base64.decode(@<欲解密数据>, 2);//先用base64解码
            @       @<原始数据> = cipher.doFinal(@<解码数据>);
            @       @<返回数据> = new String(@<原始数据>, @<编码类型>);
            @ )
            返回 (返回数据)
        }

        {

        }
    }
}


加密解密调用实现部分:

<火山程序 类型 = "通常" 版本 = 1 />

变量 加密结果 <类型 = "字节 []">

加密结果 = AES_ECB加密解密类.加密 ("12345678", "1234567812345678", "ECB/PKCS5Padding")
编辑框_内容.内容 = Base64类.编码至文本 (加密结果)

<火山程序 类型 = "通常" 版本 = 1 />

变量 解密结果 <类型 = 文本型>

解密结果 = AES_ECB加密解密类.解密 (文本到字节数组 (编辑框_内容.内容), "1234567812345678") //这里解密完是文本就不要再Base64编码了
提示框 ("解密结果:" + 解密结果)
结果为:2jbNzsip7gCp63A+R43tEQ==
结果正确了,不管哪一种都能加密和解密,但这种是我想要的,有个APP请求数据就是这样的,逆向到私钥了,可以模拟post登录了





回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2024-11-24 08:17 , Processed in 0.089615 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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