javapadding的简单介绍

博主:adminadmin 2022-11-30 07:41:06 126

本篇文章给大家谈谈javapadding,以及对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

java使用pkcs7padding为什么报错

首先准备一份明文和秘钥:

var plaintText = 'aaaaaaaaaaaaaaaa'; // 明文

var keyStr = 'bbbbbbbbbbbbbbbb'; // 一般key为一个字符串

参看官网文档,AES方法是支持AES-128、AES-192和AES-256的,加密过程中使用哪种加密方式取决于传入key的类型,否则就会按照AES-256的方式加密。

CryptoJS supports AES-128, AES-192, and AES-256. It will pick the variant by the size of the key you pass in. If you use a passphrase, then it will generate a 256-bit key.

由于Java就是按照128bit给的,但是由于是一个字符串,需要先在前端将其转为128bit的才行。

java aes badpaddingexception是什么异常

维护人员在切换环境时,使用了系统自带的jdk,导致此问题的出现

解决:替换jdk为sun的OK

java要怎么实现zeropadding的des解密

package com.va.util;

import com.zoki.util.Charset;

import java.security.InvalidAlgorithmParameterException;

import java.security.InvalidKeyException;

import java.security.NoSuchAlgorithmException;

import java.security.spec.InvalidKeySpecException;

import java.util.logging.Level;

import java.util.logging.Logger;

import javax.crypto.BadPaddingException;

import javax.crypto.spec.DESKeySpec;

import javax.crypto.SecretKeyFactory;

import javax.crypto.SecretKey;

import javax.crypto.Cipher;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.spec.IvParameterSpec;

/**

 * 注意:DES加密和解密过程中,密钥长度都必须是8的倍数。br

 * 当默认用DES,JAVA会用ECB模式,因此这里IV向量没有作用,这里,但当用CBC模式下,如果还是用SecureRandom,

 * 则每次加密的结果都会不一样,因为JAVA内部会用随机的IV来初始化Cipher对象,如示例代码,

 * 由于Cipher.getInstance("DES/CBC/PKCS5Padding")使用了CBC,

 * 因此我这里用的javax.crypto.spec.IvParameterSpec包下的IvParameterSpec来初始化向量IVbr

 * JAVA中默认的算法为ECB,默认填充方式为PKCS5Padding

 */

public class DES {

    private DES() {

    }

    /**

     * 加密

     *

     * @param src byte[] 加密的数据源

     * @param password byte[] 加密秘钥

     * @return byte[] 加密后的数据

     */

    public static byte[] encrypt(byte[] src, byte[] password) {

        try {

            DESKeySpec desKey = new DESKeySpec(password);

            //创建一个密匙工厂,然后用它把DESKeySpec转换成

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

            SecretKey securekey = keyFactory.generateSecret(desKey);

            //Cipher对象实际完成加密操作

            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            //ECB模式下,iv不需要

            IvParameterSpec iv = new IvParameterSpec(password);

            //用密匙初始化Cipher对象

            cipher.init(Cipher.ENCRYPT_MODE, securekey, iv);

            //现在,获取数据并加密

            //正式执行加密操作

            return cipher.doFinal(src);

        } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | IllegalBlockSizeException | BadPaddingException | InvalidAlgorithmParameterException ex) {

            Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);

        }

        return null;

    }

    /**

     * 加密

     *

     * @param src byte[] 加密的数据源

     * @param password String 加密秘钥

     * @return byte[] 加密后的数据

     */

    public static byte[] encrypt(byte[] src, String password) {

        byte[] keyBytes = password.getBytes(Charset.utf8);

        return encrypt(src, keyBytes);

    }

    /**

     * 解密

     *

     * @param src byte[] 解密的数据源

     * @param password byte[] 解密秘钥

     * @return byte[] 解密后的数据

     */

    public static byte[] decrypt(byte[] src, byte[] password) {

        try {

            // DES算法要求有一个可信任的随机数源

            //SecureRandom random = new SecureRandom();

            // 创建一个DESKeySpec对象

            DESKeySpec desKey = new DESKeySpec(password);

            // 创建一个密匙工厂

            SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");

            // 将DESKeySpec对象转换成SecretKey对象

            SecretKey securekey = keyFactory.generateSecret(desKey);

            // Cipher对象实际完成解密操作,CBC为加密模式,

            Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");

            //ECB模式下,iv不需要

            IvParameterSpec iv = new IvParameterSpec(password);

            // 用密匙初始化Cipher对象

            cipher.init(Cipher.DECRYPT_MODE, securekey, iv);

            // 真正开始解密操作

            return cipher.doFinal(src);

        } catch (InvalidKeyException | NoSuchAlgorithmException | InvalidKeySpecException | NoSuchPaddingException | InvalidAlgorithmParameterException | IllegalBlockSizeException | BadPaddingException ex) {

            Logger.getLogger(DES.class.getName()).log(Level.SEVERE, null, ex);

        }

        return null;

    }

    /**

     * 解密

     *

     * @param src byte[] 解密的数据源

     * @param password String 解密秘钥

     * @return byte[] 解密后的数据

     */

    public static byte[] decrypt(byte[] src, String password) {

        byte[] keyBytes = password.getBytes(Charset.utf8);

        return decrypt(src, keyBytes);

    }

}

JAVA和.NET使用DES对称加密的区别

如果我说没有区别你会信吗?

但答案还真是这样,两者没有任何区别的,只不过实现的语言代码不同而已。

那么java与dot net之间的DES是否可以通用?答案也是完全通用。无论是Java的DES加密还是dot net的DES回密,均可以使用另一种语言且不限于Java或dot net解密。够明白吗?

DES其实只是一个算法,加密与解密我们都知道算法与密码是分离的。算法是公开的,都可以用,而密码是独立于算法的。所以DES在不同的语言中实现的算法根本就是一样的——也正是因为如此不管何种语言都是通用的(除非伪DES,要知道DES算法网上本身能搜到而且是一个标准,最先是由美国安全部门公开的)

再说一下,为什么有人“通”用不起来的原因。DES其实有CBC之类的参数的,也就是针对加密块选用的不同的加密手段。正是这个参数的原因,不同的语言中使用不同的参数做为默认值,所以使用默认的方式进行让两个串进行加解密肯定是不同的。DES使用一种模式(方法)加密,用另一种模式(方法)进行解密能得到正确的结果吗?一些人不怪自己的学艺不精,反说是两种语言的DES不通用(这也就是为什么百度上会出现诸多说java和dot net的DES加密方法不通用的原因)。

即便是自己使用的DES加密的代码也是通用的(前提你要遵守DES分开算法),但不要“重复实现已经实现的东西(专业术语叫造轮子)”。

附:

DES.Model属性取值

CBC 密码块链 (CBC) 模式引入了反馈。每个纯文本块在加密前,通过按位“异或”操作与前一个块的密码文本结合。这样确保了即使纯文本包含许多相同的块,这些块中的每一个也会加密为不同的密码文本块。在加密块之前,初始化向量通过按位“异或”操作与第一个纯文本块结合。如果密码文本块中有一个位出错,相应的纯文本块也将出错。此外,后面的块中与原出错位的位置相同的位也将出错。

ECB 电子密码本 (ECB) 模式分别加密每个块。这意味着任何纯文本块只要相同并且在同一消息中,或者在用相同的密钥加密的不同消息中,都将被转换成同样的密码文本块。如果要加密的纯文本包含大量重复的块,则逐块破解密码文本是可行的。另外,随时准备攻击的对手可能在您没有察觉的情况下替代和交换个别的块。如果密码文本块中有一个位出错,相应的整个纯文本块也将出错。

OFB 输出反馈 (OFB) 模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块。此模式与 CFB 相似;这两种模式的唯一差别是移位寄存器的填充方式不同。如果密码文本中有一个位出错,纯文本中相应的位也将出错。但是,如果密码文本中有多余或者缺少的位,则那个位之后的纯文本都将出错。

CFB 密码反馈 (CFB) 模式将少量递增的纯文本处理成密码文本,而不是一次处理整个块。该模式使用在长度上为一个块且被分为几部分的移位寄存器。例如,如果块大小为 8 个字节,并且每次处理一个字节,则移位寄存器被分为 8 个部分。如果密码文本中有一个位出错,则一个纯文本位出错,并且移位寄存器损坏。这将导致接下来若干次递增的纯文本出错,直到出错位从移位寄存器中移出为止。

CTS 密码文本窃用 (CTS) 模式处理任何长度的纯文本并产生长度与纯文本长度匹配的密码文本。除了最后两个纯文本块外,对于所有其他块,此模式与 CBC 模式的行为相同。

DES.Padding属性的取值

None 不填充。

PKCS7 PKCS #7 填充字符串由一个字节序列组成,每个字节填充该字节序列的长度。

Zeros 填充字符串由设置为零的字节组成。

ANSIX923 ANSIX923 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节均填充数字零。

ISO10126 ISO10126 填充字符串由一个字节序列组成,此字节序列的最后一个字节填充字节序列的长度,其余字节填充随机数据。

当Mode不同时,解密的内密内容能与相同吗?PaddingMode不同时,解密的内容的结尾部分能相同吗(填充结果只涉及到最后的一个块).所以当不管何种语言使用相同的Mode及PaddingMode时,加解密的结果是相同的(当然不排除部分语言不实现全部的Mode和PaddingMode)但,基本的都是实现了的,所以基本上任何两种语言之间的DES都可以实现相同的加解密结果!而java和dot net中的DES显然指的是算法,两者是相同的,可以随意使用(Java中dot net中的Mode默认值是不同的,一定要设置相同的Mode和PaddingMode才可以的,不要双方都采用默认值,那样真的通不起来)

java用3DES加密算法(ECB/PKCS5Padding)如何计算可以得到下面的结果?

3DES需要的输入明文长度、密文长度都是8的整数倍。

而CBC.CFB都需要初始化向量的参数才能加密、解密、。

javapadding的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于、javapadding的信息别忘了在本站进行查找喔。

The End

发布于:2022-11-30,除非注明,否则均为首码项目网原创文章,转载请注明出处。