精华内容
下载资源
问答
  • 密文与明文一样长
    2021-04-17 10:22:18

    这篇文章上次修改于 694 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

    原理是异或加密char c[] = "大家好".toCharArray();

    for(int i = 0;i

    c[i] = (char)(c[i] ^ 'Q');//将明文转换成密文

    }

    String string = new String(c, 0, c.length);

    System.out.println("密文:" + string);

    for(int i=0;i

    c[i] = (char)(c[i] ^ 'Q');//将密文还原为明文

    }

    String string1 = new String(c, 0, c.length);

    System.out.println("明文:" + "\n" + string1);

    上面这个没有用户密钥,能直接解密,我们来升级一下import java.nio.charset.Charset;

    public class DeEnCode {

    private static final String key0 = "FECOI()*&

    private static final Charset charset = Charset.forName("UTF-8");

    private static byte[] keyBytes = key0.getBytes(charset);

    public static String encode(String enc){

    byte[] b = enc.getBytes(charset);

    for(int i=0,size=b.length;i

    for(byte keyBytes0:keyBytes){

    b[i] = (byte) (b[i]^keyBytes0);

    }

    }

    return new String(b);

    }

    public static String decode(String dec){

    byte[] e = dec.getBytes(charset);

    byte[] dee = e;

    for(int i=0,size=e.length;i

    for(byte keyBytes0:keyBytes){

    e[i] = (byte) (dee[i]^keyBytes0);

    }

    }

    return new String(e);

    }

    public static void main(String[] args) {

    String s="you are right";

    String enc = encode(s);

    String dec = decode(enc);

    System.out.println(enc);

    System.out.println(dec);

    }

    }

    现在你就可以自定义key,增加难度,但是这个还是不安全,密钥还是可能被套取,所以加入当前时间,这样每次生成的密钥都不一样

    更多相关内容
  • AES介绍严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128位,密钥长度则可以是128,192或256位;...

    AES介绍

    严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128位,密钥长度则可以是128,192或256位;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256位为上限。加密过程中使用的密钥是由Rijndael密钥生成方案产生。

    AES为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。在AES标准规范中,分组长度只能是128位,也就是说,每个分组为16个字节(每个字节8位)。密钥的长度可以使用128位、192位或256位。密钥的长度不同,推荐加密轮数也不同,如下表所示:

    AES

    密钥长度(32位比特字)

    分组长度(32位比特字)

    加密轮数

    AES-128

    4

    4

    10

    AES-192

    6

    4

    12

    AES-256

    8

    4

    14

    轮数在下面介绍,这里实现的是AES-128,也就是密钥的长度为128位,加密轮数为10轮。

    上面说到,AES的加密公式为C = E(K,P),在加密函数E中,会执行一个轮函数,并且执行10次这个轮函数,这个轮函数的前9次执行的操作是一样的,只有第10次有所不同。也就是说,一个明文分组会被加密10轮。AES的核心就是实现一轮中的所有操作。

    密钥长度

    由于采用了256位AES加密,使用了CBC模式加PKCS #5补齐,所以AES的密文字节长度 = (明文长度 +1) / 16 * 16(即比明文长度大的最小的16的倍数)。

    JNCryptor返回的密文长度则是在此基础上再加上66个字节。

    返回的密文是二进制数据,无法直接显示。如果需要进一步编码为可显示字符串,则需进行BASE64编码或者十六进制编码。编码后的数据长度会进一步增加(BASE64是增长为4/3倍起的最小的4的倍数,十六进制编码是增长为2倍)。比如,对原文长度在32-47个字节之间的明文,经过AES256JNCryptor加密后的密文长度就是114个字节,再做一次BASE64编码转换成可显示字符就成了152个字符

    明文与密文长度关系

    在原始数据长度为 16 的整数倍时

    假如原始数据长度等于 16n,则使用 NoPadding 时加密后数据长度等于 16n,其它情况下加密数据长度等于 16*(n+1)。

    在不足 16 的整数倍的情况下

    假如原始数据长度等于 16n+m [其中 m 小于16],除了 NoPadding 填充之外的任何方式,加密数据长度都等于 16(n+1);

    例如:算法/模式/填充(AES/CBC/PKCS5Padding),明文69字符,则密文为69=164+5,其中n为4,m为5,密文长度为16(4+1)=80字节,而如果你再转为base64之后,长度也会变长。

    base64长度

    Base64编码要求把3个8位字节(38=24)转化为4个6位的字节(46=24),之后在6位的前面补两个0,形成8位一个字节的形式。

    如果剩下的字符不足3个字节,则用0填充,输出字符使用'=',因此编码后输出的文本末尾可能会出现1或2个'='。

    为了保证所输出的编码位可读字符,Base64制定了一个编码表,以便进行统一转换。编码表的大小为2^6=64,这也是Base64名称的由来。它长度为=bytestring * (4 / 3),不能被3整除的,加到最小被3整除的数 ,如80你需要加到81,结果81*(4/3)=108

    实例:

    V61234567820200612D102103f,V51234567820200612D102103f

    6B6N1qoTEmyJKxQOO6xdwXu2xP+bbnjsAadbDpGuOf5CAwtW8qVNseD4cWlAdX47KwTNNmm1NpMsYCSGuqYuGg==

    明文长:53

    密文base64:88

    计算:53=163+5,16(3+1)=64,64(4/3),补两个0(=)66/34=88

    展开全文
  • RSA密钥长度、明文长度和密文长度

    万次阅读 2018-06-02 13:48:35
    本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,天缘以后还会补充几篇RSA基础知识专题文章,用最简单最通俗的语言描述RSA,让各位了解...

    本文介绍RSA加解密中必须考虑到的密钥长度、明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,天缘以后还会补充几篇RSA基础知识专题文章,用最简单最通俗的语言描述RSA,让各位了解RSA算法本身其实也很简单,RSA的复杂度是因为数学家把效率和安全也考虑进去的缘故。

    本文先只谈密钥长度、明文长度和密文长度的概念知识,RSA的理论及示例等以后再谈。提到密钥,我们不得不提到RSA的三个重要大数:公钥指数e、私钥指数d和模值n。这三个大数是我们使用RSA时需要直接接触的,理解了本文的基础概念,即使未接触过RSA的开发人员也能应对自如的使用RSA相关函数库,无需深入了解e、d、n是如何生成的,只需要知道我该如何用、要注意什么。

    一、密钥长度

    1、密钥是指谁?

    首先我们说的“密钥”是指谁?由于RSA密钥是(公钥+模值)、(私钥+模值)分组分发的,单独给对方一个公钥或私钥是没有任何用处,所以我们说的“密钥”其实是它们两者中的其中一组。但我们说的“密钥长度”一般只是指模值的位长度。目前主流可选值:1024、2048、3072、4096...

    2、模值主流长度是多少?

    目前主流密钥长度至少都是1024bits以上,低于1024bit的密钥已经不建议使用(安全问题)。那么上限在哪里?没有上限,多大都可以使用。所以,主流的模值是1024位,实际运算结果可能会略小于1024bits,注意,这个值不是绝对的,跟素数的生成算法有关系,只是告诉素数生成器“帮我生成一个接近1024位的素数而已”,然后生成器“好,给您一个,这个差不多1024位”。

    素数生成器这么厉害?说生成1024位就会出个1024位的大整数?真实的情况是素数生成器也只是在1024bits对应的整数附近进行“摸索”而已,大家其实都不容易,又要快又要准确又要随机性,那么素数生成器也只能应付一下,找到1024位的算是好运,没找到1024位,1023位也照样送出来:)。

    3、公钥指数如何确定?

    公钥指数是随意选的,但目前行业上公钥指数普遍选的都是65537(0x10001,5bits),该值是除了1、3、5、17、257之外的最小素数,为什么不选的大一点?当然可以,只是考虑到既要满足相对安全、又想运算的快一点(加密时),PKCS#1的一个建议值而已。

    有意的把公钥指数选的小一点,但是对应私钥指数肯定很大,意图也很明确,大家都要用公钥加密,所以大家时间很宝贵,需要快一点,您一个人私钥解密,时间长一点就多担待,少数服从多数的典型应用。

    4、私钥指数如何确定?

    公钥指数随意选,那么私钥就不能再随意选了,只能根据算法公式(ed%k=1,k=(p-1)(q-1))进行运算出来。那么私钥指数会是多少位?根据ed关系,私钥d=(x*k+1)/e,所以单看这个公式,私钥指数似乎也不是唯一结果,可能大于也可能小于1024bits的,但我们习惯上也是指某个小于1024bits的大整数。

    包括前文的公钥指数,在实际运算和存储时为方便一般都是按照标准位长进行使用,前面不足部分补0填充,所以,使用保存和转换这些密钥需要注意统一缓冲区的长度。

    二、明文长度

    网上有说明文长度小于等于密钥长度(Bytes)-11,这说法本身不太准确,会给人感觉RSA 1024只能加密117字节长度明文。实际上,RSA算法本身要求加密内容也就是明文长度m必须0<m<n,也就是说内容这个大整数不能超过n,否则就出错。那么如果m=0是什么结果?普遍RSA加密器会直接返回全0结果。如果m>n,运算就会出错?!那怎么办?且听下文分解。

    所以,RSA实际可加密的明文长度最大也是1024bits,但问题就来了:

    如果小于这个长度怎么办?就需要进行padding,因为如果没有padding,用户无法确分解密后内容的真实长度,字符串之类的内容问题还不大,以0作为结束符,但对二进制数据就很难理解,因为不确定后面的0是内容还是内容结束符。

    只要用到padding,那么就要占用实际的明文长度,于是才有117字节的说法。我们一般使用的padding标准有NoPPadding、OAEPPadding、PKCS1Padding等,其中PKCS#1建议的padding就占用了11个字节。

    如果大于这个长度怎么办?很多算法的padding往往是在后边的,但PKCS的padding则是在前面的,此为有意设计,有意的把第一个字节置0以确保m的值小于n。

    这样,128字节(1024bits)-减去11字节正好是117字节,但对于RSA加密来讲,padding也是参与加密的,所以,依然按照1024bits去理解,但实际的明文只有117字节了。

    关于PKCS#1 padding规范可参考:RFC2313 chapter 8.1,我们在把明文送给RSA加密器前,要确认这个值是不是大于n,也就是如果接近n位长,那么需要先padding再分段加密。除非我们是“定长定量自己可控可理解”的加密不需要padding。

    三、密文长度

    密文长度就是给定符合条件的明文加密出来的结果位长,这个可以确定,加密后的密文位长跟密钥的位长度是相同的,因为加密公式:

    C=(P^e)%n

    所以,C最大值就是n-1,所以不可能超过n的位数。尽管可能小于n的位数,但从传输和存储角度,仍然是按照标准位长来进行的,所以,即使我们加密一字节的明文,运算出来的结果也要按照标准位长来使用(当然了,除非我们能再采取措施区分真实的位长,一般不在考虑)。

    至于明文分片多次加密,自然密文长度成倍增长,但已不属于一次加密的问题,不能放到一起考虑。

    展开全文
  • 变大就变大吧,对于日常使用和APP开发或者服务端开发而言,大个几k字节是无所谓的,但是如果是使用RF(射频)通信,那么大几个字节就会导致通信失败率的增加,所以对于这样的场景,你就需要确保密文明文一样长,...

    加密之后会变大的问题

      做过加密的人都应该有“加密之后文件会变大”的经验。变大就变大吧,对于日常使用和APP开发或者服务端开发而言,大个几k字节是无所谓的,但是如果是使用RF(射频)通信,那么大几个字节就会导致通信失败率的增加,所以对于这样的场景,你就需要确保密文和明文一样长,最好是还能短一点。
      由于短一点是压缩算法的功劳,和加密算法本身没有关系,我们这里不做分析,今天我们以openssl的命令行工具为例来学习如何确保密文长度等于明文长度。

    为啥密文会比明文长

      为啥加密之后就会边长呢?为了更安全!那么为了更安全长到哪里了?
        1. 长在填充;
        2. 长在salt;
      填充主要是为了解决分组加密,明文长度不是分组的整数倍的问题,为了简化填充规则,如果明文是分组的倍数,就填充一个整的分组。
    如何确保明文和密文的长度是一致的
    上图就是一个明文是128bits的aes-128-cbc的加密样例,填充了整整一个128bits的填充块。
      salt是作为秘钥和IV生成的一个随机因子,为了解决相同的明文和秘钥生成相同的密文的问题,由于salt必须参与到运算中,所以salt通常是以明文的形式拼接在明文的最前面,salt通常是16个字节的长度,前8字节是个固定的magic数,后8个字节是随机数,这样有salt的密文至少会增加一个长度是16个字节的明文头部信息。
    如何确保明文和密文的长度是一致的
    上图就是一个有salt的,明文是一个字节的密文是16+1个字节的样例输出。

    如何控制让密文和明文长度一致呢

      既然增长是由于填充和salt导致的,那么要保证一样长,那就需要去掉填充和salt,当然去掉填充的前提需要明文的长度是分组的倍数,要不然加密会报错的。
    如何确保明文和密文的长度是一致的
    上图是一个nopad和nosalt的截图,我们在看一个对比图,如下:
    如何确保明文和密文的长度是一致的

    特别提醒小心-a的参数

      -a在参数在openssl里面是对加密或者解密结果的base64的处理,如果是加密就是base64编码,反之是解码。base64会把没3个字节编码为4个字节的科输入字符,如果不小心用到这个选项,你会发现密文长度填充了不少。
      重要的事情说三遍,用了-a会变长!用了-a会变长!用了-a会变长!

    进一步的学习资料推荐

      使用openssl做AES的加密
      使用openssl做SSL/TLS/HTTPS的实验

    转载于:https://blog.51cto.com/makofly/2122601

    展开全文
  • 则可以视明文长度=秘钥bit长度值/8-11,比如我下面使用的秘钥长度是1024bit,那么她一次可加密的明文长度就是:1024/8-11=117byte,所以当明文时或不确定时,就需要进行分块加密,而每一块就是117byte。...
  • 提出了Simple Matrix方案的改进版本,通过使用具有随机二次多项式的可改变形式的...新的方案将密文与明文的比例改进为大于等于两倍,打破了固定不变的密文与明文比例,使其拥有一个灵活的明密文比,以适应不同的需求。
  • 与明文信息对立的是密文(密文信息\加密信息) 3)什么是密文密文的概念也非常简单,前面提到了,没有经过加密的内容是明文,那密文自然就是经过加密的内容了。密文的设计初衷是为了提高用户的密码的安全性,譬如...
  • 我在一些资料上查到, 明文密文,密码 这三个东西均为64位,但试验中好像不是呀!
  • 明文密文唯一对应吗(也就是同样的密文不可能由不同的明文生成)?分享到:2014-01-08 17:16网友采纳这个现在已经被破解了,就是说有方法可以找到能生成同样密文的的密码, 搜下王小云和MD5就知道了。但安全性...
  • 所以我又把相同的明文又加了一边密发现我自己的加密密文跟对方demo里面的密文一样,连长度都差了很多,但是明文一样的。刚开始我用eclipse,发现我eclipse的编码格式是GBK,所以又改成用idea,把编码格式改成UTF...
  • string xmlPublicKey = "uOMVRWVhMuGmnN7snAxmWmWb1cQejrExHlKnFcNxiXjx49nFRu7YCOovVCJBVNNa1g9b5BqU21KGBV7eArLmlTxGl1fzZU7KAG+HarctuBoCECVm7... } 同一个公钥,为什么每次加密后出来的密文都不一样呢?
  • //输出密文(每次都不一样,更安全) echo '<Br><br>jia mi:::'.$ciphertext_base64 . "\n"; //解密: $ciphertext_dec = base64_decode($ciphertext_base64); $iv_dec = substr($ciphertext_dec, 0, $iv_size...
  • 该工具类中用到了BASE64,需要...RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行。 RSA加密对明文的长度是有限制的,如果加密数据过大会抛出如下异常:  ...
  • 密码学在计算机科学中使用非常广泛,...在完全理解HTTPS之前,有必要弄清楚一些密码学相关的概念,比如:明文密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书。 密码(cipher) 密码学中的密码(c
  • 问题:已知十段密文,以及一段待解出的特定密文,如何获取特定密文明文?已知:所有的密文都是使用同样的key,使用stream cipher(流加密),只是简单使用原文和key异或得到密文,而且key是随机的,长于所有的原文...
  • pin密文是1.1+1.2 1+2=3,最后1和2进行二进制异或,3出表示07 和密码是什么后面异或 主密加密工密,工密加密密码 密码加密就好比,方程式,也可以说实一种投影,就是密码通过工作密码进行加密...
  • 备注:实际中会发现环回口无法网络正常连接,是因为子网掩码不一样,OSPF 路由器将环回口的网络类型认为是一种特殊的类型, LOOPBACK 类型。因此不管环回口前缀长度为多少,都一致认为其长度为 32。 因此,只需要...
  • <p>input type="password" 在手机端表现为输入先显示明文然后一秒变密文,在web端则输入就是密文 是什么原因让input手机端和web端的表现不一样</p>
  • 理解HTTPS前需要理解这些概念:明文密文、密码、密钥、对称加密、非对称加密、摘要、数字签名、数字证书 密码: 密码学中的密码(cipher)和我们日常生活中所说的密码不太一样,计算机术语『密码 cipher』是一种...
  • MD5明文密码加密

    千次阅读 2020-08-02 23:48:46
    密文: 02F5D4E65503F85D7E94AA8ADD5BE907(32位) 2.2、MD5加密的特点 (不可逆),意思是当MD5对密码加密后是不能逆向解码的,保证了数据的安全 (适用广泛),意思是所有的字符串都能加密成上图的32位的
  • 我们只需要知道密文就行了 本来是想在网上在线加密就行了 可是它这个格式我不知道怎么填 然后有了下面的故事 这个python脚本已知n和e对明文进行加密 n = '94dd2a8675fb779e6b9f7103698634cd400f27a154afa67af6166...
  • java:三重des加密中明文、密文长度

    千次阅读 2012-06-13 17:03:26
    明文byte[]长度:7 相应的16进制字符串值:0123456789abcd  加密后byte[]长度:8 相应的16进制字符串值:19dffce951d8c37d  解密后byte[]长度:7 相应的16进制字符串值:0123456789abcd  对长度为8的字节...
  • 我们建议的性能几乎原始CS-PKE一样高效。 据我们所知,这是第一个具有防泄漏能力的CS型密码系统,其明文长度密钥泄漏参数无关,并且是最有效的IND-CCA2 PKE方案,可承受高达log q-ω(logκ )泄漏。
  • 下面是加密的代码,对于输入的字符,每个字符单独进行加密,但是加密之后的位数不一样,是因为没有填充的关系吗,那要如何解决呢 ``` void RSA::Encrypt(const char *filename, const char *output, const char *...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,908
精华内容 8,363
热门标签
关键字:

密文与明文一样长