java中的Pkcs7填充

java中的Pkcs7填充,java,padding,encryption,des,Java,Padding,Encryption,Des,Iam使用C#net中的TripleDes/cbc/pkcs7padding对文件进行加密。 我需要用java解密。在java中,我使用DESede/CBC/pkcs5p 但文件已解密,但已损坏 *在java中是否可以使用pkcs7padding? 或任何其他使用pkcs7填充加密的java文件解密解决方案 C#代码 Java代码 public class DecryptFinal { private static Cipher dcipher; private static byte[] i

Iam使用C#net中的TripleDes/cbc/pkcs7padding对文件进行加密。 我需要用java解密。在java中,我使用DESede/CBC/pkcs5p 但文件已解密,但已损坏

*在java中是否可以使用pkcs7padding? 或任何其他使用pkcs7填充加密的java文件解密解决方案

C#代码

Java代码

public class DecryptFinal {
private static Cipher dcipher;

private static byte[] iv = {
    (byte)0xB2, (byte)0x12, (byte)0xD5, (byte)0xB2,
    (byte)0x44, (byte)0x21, (byte)0xC3, (byte)0xC3
    };


public static void main(String[] args){

    try {
        String s = "123456789123456789111234";
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

        SecretKeyFactory keyfactory=SecretKeyFactory.getInstance("DESede");
        byte[] encodedkey=s.getBytes();
        System.out.println();
         SecretKey key = keyfactory.generateSecret(new DESedeKeySpec(encodedkey));
         System.out.println(new DESedeKeySpec(encodedkey));
        SecretKeySpec(encodedKey,0,encodedKey.length,"DESede" );

        dcipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        FileInputStream fs =new FileInputStream("E:\\Test1\\Test1\\Encrypted Files\\Wedding bells.akr");
        FileOutputStream os= new FileOutputStream("E:\\Test1\\Test1\\Encrypted Files\\Encrypted Files\\E-pub Totorials");
        byte[] buf = new byte[1024];// bytes read from stream will be decrypted
        CipherInputStream cis = new CipherInputStream(fs, dcipher);// read in the decrypted bytes and write the clear text to out
        int numRead = 0;
        while ((numRead = cis.read(buf)) >= 0) {
            os.write(buf, 0, numRead);
        }
        cis.close();// close all streams
        fs.close();
        os.close();

    }
    catch(FileNotFoundException e) {
        System.out.println("File Not Found:" + e.getMessage());
        return;
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        System.out.println("I/O Error:" + e.getMessage());
    }
    catch (InvalidKeySpecException e) {
        // TODO: handle exception
        e.printStackTrace();
    }

PKCS#7填充与PKCS#5填充兼容。你的问题一定在别处。用C#显示加密代码,用Java显示解密代码。作为一个在黑暗中拍摄的完整镜头,我想知道您是否正确地在两侧指定了IV值。正如Duncan Jones所指出的,您必须在解密端使用与加密端相同的IV。我们必须指出您没有这样做吗?另一个错误来源可能是用于密钥字符串的字符编码。当从字符移动到字节时,在两侧显式指定UTF-8或任何内容。
public class DecryptFinal {
private static Cipher dcipher;

private static byte[] iv = {
    (byte)0xB2, (byte)0x12, (byte)0xD5, (byte)0xB2,
    (byte)0x44, (byte)0x21, (byte)0xC3, (byte)0xC3
    };


public static void main(String[] args){

    try {
        String s = "123456789123456789111234";
        AlgorithmParameterSpec paramSpec = new IvParameterSpec(iv);

        SecretKeyFactory keyfactory=SecretKeyFactory.getInstance("DESede");
        byte[] encodedkey=s.getBytes();
        System.out.println();
         SecretKey key = keyfactory.generateSecret(new DESedeKeySpec(encodedkey));
         System.out.println(new DESedeKeySpec(encodedkey));
        SecretKeySpec(encodedKey,0,encodedKey.length,"DESede" );

        dcipher = Cipher.getInstance("DESede/CBC/PKCS5Padding");
        dcipher.init(Cipher.DECRYPT_MODE, key, paramSpec);
        FileInputStream fs =new FileInputStream("E:\\Test1\\Test1\\Encrypted Files\\Wedding bells.akr");
        FileOutputStream os= new FileOutputStream("E:\\Test1\\Test1\\Encrypted Files\\Encrypted Files\\E-pub Totorials");
        byte[] buf = new byte[1024];// bytes read from stream will be decrypted
        CipherInputStream cis = new CipherInputStream(fs, dcipher);// read in the decrypted bytes and write the clear text to out
        int numRead = 0;
        while ((numRead = cis.read(buf)) >= 0) {
            os.write(buf, 0, numRead);
        }
        cis.close();// close all streams
        fs.close();
        os.close();

    }
    catch(FileNotFoundException e) {
        System.out.println("File Not Found:" + e.getMessage());
        return;
    } catch (NoSuchAlgorithmException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchPaddingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();

    } catch (InvalidKeyException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvalidAlgorithmParameterException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    catch (IOException e) {
        System.out.println("I/O Error:" + e.getMessage());
    }
    catch (InvalidKeySpecException e) {
        // TODO: handle exception
        e.printStackTrace();
    }