为什么pdf加密文件怎么解密可以,解密却失败

查看: 254|回复: 11
解密方法写完了
加密确晕了!求解
阅读权限30
在线时间 小时
签到天数:2 天结帖率: (3/8)
解密的程序写完了 源代码如下& &&&加密的方法确不会写了 晕了& &帮忙写一下&&谢谢
源代码&&密码文本型&&字符串1文本型&&密码字符串文本型&&a整数型&&b整数型&&XOR后的数值整数型&&上一个字符串文本型&&最终ASC文本型&&文本文本型&&密码 = “f”文本 = “4C1F”密码字符串 = 取文本中间 (密码, 1, 1)a = 取代码 (密码字符串, )字符串1 = 取文本中间 (文本, 3, 2)b = 进制_十六到十 (字符串1)XOR后的数值 = 位异或 (到整数 (a), 到整数 (b))&&' =98上一个字符串 = 取文本中间 (文本, 1, 2)最终ASC = 字符 (XOR后的数值 - 进制_十六到十 (上一个字符串))&&' 减去前两个的值调试输出 (最终ASC)&&' 输出-spec特殊功能支持库
.版本 2
.支持库 spec
.局部变量 密码, 文本型
.局部变量 字符串1, 文本型
.局部变量 密码字符串, 文本型
.局部变量 a, 整数型
.局部变量 b, 整数型
.局部变量 XOR后的数值, 整数型
.局部变量 上一个字符串, 文本型
.局部变量 最终ASC, 文本型
.局部变量 文本, 文本型
密码 = “f”
文本 = “4C1F”
密码字符串 = 取文本中间 (密码, 1, 1)
a = 取代码 (密码字符串, )
字符串1 = 取文本中间 (文本, 3, 2)
b = 进制_十六到十 (字符串1)
XOR后的数值 = 位异或 (到整数 (a), 到整数 (b))&&' =98
上一个字符串 = 取文本中间 (文本, 1, 2)
最终ASC = 字符 (XOR后的数值 - 进制_十六到十 (上一个字符串))&&' 减去前两个的值
调试输出 (最终ASC)&&' 输出-
如上& &加密就是把那个最后输出的&-&&&再加密回去&&谢谢
回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至
可获得加分喔。友情提醒:本版被采纳的主题可在
帖子申请荣誉值,获得 1点 荣誉值,荣誉值可兑换终身vip用户组哦。快捷通道: →
阅读权限90
在线时间 小时
签到天数: 4 天结帖率: (14/14)
先写解密的话 你拿什么东西调试解密& &醉了
您可以选择打赏方式支持他
阅读权限70
在线时间 小时
签到天数: 4 天结帖率: (8/9)
一般都是先写加密后再解密,没有加密的数据何来有解密?既然你会解密了.那照着解密的步骤一步一步的加密并不是难事
您可以选择打赏方式支持他
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (12/14)
没有可调用的加密&&是分析出来的& & 解密会了 加密不会写
我刚看了一下你贴出来的代码,这个无解
您可以选择打赏方式支持他
阅读权限30
在线时间 小时
签到天数: 2 天结帖率: (3/8)
解密跟加密本身就是相反的逆运算。正常都是会加密不会解密。你直接调用那个加密不就好了
没有可调用的加密&&是分析出来的& & 解密会了 加密不会写
您可以选择打赏方式支持他
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (12/14)
我是根据一个加密写的& && & 所以加密代码没想明白
解密跟加密本身就是相反的逆运算。正常都是会加密不会解密。你直接调用那个加密不就好了
您可以选择打赏方式支持他
阅读权限140
在线时间 小时
签到天数: 4 天
我是根据一个加密写的& && & 所以加密代码没想明白
你理清了加密的步骤和方法,解密自然就好些了
您可以选择打赏方式支持他
阅读权限30
在线时间 小时
签到天数: 2 天结帖率: (3/8)
先研究解药在研究毒药。没有毒药既然也能研究出解药。大神
我是根据一个加密写的& && & 所以加密代码没想明白
您可以选择打赏方式支持他
阅读权限30
在线时间 小时
签到天数: 2 天结帖率: (3/8)
你应该先写加密,然后按照加密反过来一步一步解密,才省时省力
我是根据一个加密写的& && & 所以加密代码没想明白
您可以选择打赏方式支持他
阅读权限140
在线时间 小时
签到天数: 4 天结帖率: (12/14)
先研究解药在研究毒药。没有毒药既然也能研究出解药。大神
您可以选择打赏方式支持他
阅读权限140
在线时间 小时
签到天数: 4 天
你应该先写加密,然后按照加密反过来一步一步解密,才省时省力
您可以选择打赏方式支持他
您需要登录后才可以回帖
回帖并转播
精易论坛 - 有你更精彩 /1
post班正在招收学员中!app班正在招收学员中!!
要报名学习的学员们抓紧抓紧了哈!!
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
揭阳精易科技有限公司申明:我公司所有的培训课程版权归精易所有,任何人以任何方式翻录、盗版、破解本站培训课程,我们必将通过法律途径解决!
公司简介:揭阳市揭东区精易科技有限公司致力于易语言教学培训/易语言学习交流社区的建设与软件开发,多年来为中小企业编写过许许多多各式软件,并把多年积累的开发经验逐步录制成视频课程供学员学习,让学员全面系统化学习易语言编程,少走弯路,减少对相关技术的研究与摸索时间,从而加快了学习进度!
Powered by1719人阅读
JAVA项目实战经验(12)
& & & & 前段时间,用了个AES加密解密的方法,详见上篇博客。加解密方法在window上测试的时候没有出现任何问题,将加密过程放在安卓上,解密发布到Linux服务器的时候,安卓将加密的结果传到Linux上解密的时候却总是失败,让用户不能成功登录,经过检查,测试后,发现AES在Linux上解密失败,出现错误:
& & & & javax.crypto.BadPaddingException: Given final block not properly padded
现在来回顾下自己的解决思路:
& & & & 加密过程是在安卓上,解密是在Linu上,会不会是因为环境的不同,在加密过程中产生的二进制和在解密过程中产生的二进制不一样呢?可是在经过联调后,比对二进制,发现没有问题。那问题是在哪里呢?
& & & &继续联调, 仔细比对加密和解密过程中每一步产生的结果,发现了问题:
Linux解密端:
& & & &发现这里的cipher下的 firstService是有值的。
安卓加密端:
& & & &发现这里的cipher下的 firstService是没有值的。
百度后发现:
& & & &加密解密方法的唯一差别是Cipher对象的模式不一样,这就排除了程序写错的可能性。因为错误信息是在宜昌中出现的,其大概意思是:提供的字块不符合填补的。什么意思呢?原来在用加密的时候,最后一位长度不足,它会自动补足,那么在我们进行字节数组到字串的转化过程中,可以把它填补的不可见字符改变了,所以系统抛出异常。
& & & & 问题找到,怎么解决呢?方式如下:
package ICT.base.rest.services.
import java.io.UnsupportedEncodingE
import java.security.InvalidKeyE
import java.security.NoSuchAlgorithmE
import java.security.SecureR
import javax.crypto.BadPaddingE
import javax.crypto.C
import javax.crypto.IllegalBlockSizeE
import javax.crypto.KeyG
import javax.crypto.NoSuchPaddingE
import javax.crypto.SecretK
import javax.crypto.spec.IvParameterS
import javax.crypto.spec.SecretKeyS
public class AESDecodeUtils {
public static void main(String[] args) {
String content = &g25&;
String pwd = &&;
String addPwd = &123456&;
System.out.println(&加密前content:& + content);
byte[] enAccount = encrypt(content, addPwd);
byte[] enPwd = encrypt(pwd, addPwd);
String encryptResultStr = parseByte2HexStr(enAccount);
String parseByte2HexStr2 = parseByte2HexStr(enPwd);
System.out.println(&加密后content:& + encryptResultStr);
// 解密 ——账号/身份证号
byte[] accountFrom = AESDecodeUtils.parseHexStr2Byte(encryptResultStr);
byte[] deAccount = AESDecodeUtils.decrypt(accountFrom, addPwd);
String userAccount = new String(deAccount);
System.out.println(&解密后content:& + userAccount);
// 解密——密码
byte[] pwdFrom = AESDecodeUtils.parseHexStr2Byte(parseByte2HexStr2);
byte[] deUserPwd = AESDecodeUtils.decrypt(pwdFrom, addPwd);
String userPwd = new String(deUserPwd);
// System.out.println(userPwd);
* @param content
要加密的内容
* @param password
加密使用的密钥
* @return 加密后的字节数组
public static byte[] encrypt(String content, String password) {
SecureRandom random =
&span style=&color:#ff0000;&&random = SecureRandom.getInstance(&SHA1PRNG&);
random.setSeed(password.getBytes());&/span&
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
KeyGenerator kgen = KeyGenerator.getInstance(&AES&);
// kgen.init(128, new SecureRandom(password.getBytes()));
&span style=&color:#ff0000;&&kgen.init(128, random);&/span&
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, &AES&);
Cipher cipher = Cipher.getInstance(&AES&);// 创建密码器
byte[] byteContent = content.getBytes(&utf-8&);
cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(byteContent);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
* 将二进制转换成16进制 加密
* @param buf
public static String parseByte2HexStr(byte buf[]) {
StringBuffer sb = new StringBuffer();
for (int i = 0; i & buf. i++) {
String hex = Integer.toHexString(buf[i] & 0xFF);
if (hex.length() == 1) {
hex = '0' +
sb.append(hex.toUpperCase());
return sb.toString();
* @param content
待解密内容
* @param password
public static byte[] decrypt(byte[] content, String password) {
SecureRandom random =
&span style=&color:#ff0000;&&random = SecureRandom.getInstance(&SHA1PRNG&);
random.setSeed(password.getBytes());&/span&
} catch (NoSuchAlgorithmException e1) {
e1.printStackTrace();
KeyGenerator kgen = KeyGenerator.getInstance(&AES&);
// kgen.init(128, new SecureRandom(password.getBytes()));
&span style=&color:#ff0000;&&kgen.init(128, random);&/span&
SecretKey secretKey = kgen.generateKey();
byte[] enCodeFormat = secretKey.getEncoded();
SecretKeySpec key = new SecretKeySpec(enCodeFormat, &AES&);
Cipher cipher = Cipher.getInstance(&AES&);// 创建密码器
cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
byte[] result = cipher.doFinal(content);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
* 将16进制转换为二进制
* @param hexStr
public static byte[] parseHexStr2Byte(String hexStr) {
if (hexStr.length() & 1)
byte[] result = new byte[hexStr.length() / 2];
for (int i = 0; i & hexStr.length() / 2; i++) {
int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2),
result[i] = (byte) (high * 16 + low);
&运行结果:
将加密放到安卓端,解密放大Linux上后,如下:
& & & &此时cipher下的 firstService不再是Null,都有了值
安卓加密端:
Linux解密端:
& & & AES是对称加密,解密端改变解密过程,同样,加密端的加密过程也会改变,不管怎么着,调程序还是得要有耐心,用一个东西,其简单基本的原理还是要知道的。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:493662次
积分:10720
积分:10720
排名:第1104名
原创:160篇
评论:1900条
(1)(1)(4)(3)(6)(4)(3)(1)(4)(4)(2)(4)(4)(2)(4)(3)(3)(3)(4)(4)(1)(4)(4)(3)(3)(5)(2)(3)(3)(4)(2)(3)(3)(3)(3)(4)(4)(4)(7)(3)(2)(4)(5)(14)(4)

我要回帖

更多关于 pdf加密文件怎么解密 的文章

 

随机推荐