通过自我实现的crypter类加密和解密对象

时间:2012-10-20 13:55:10

标签: java encryption

我在作业中感到困惑:D 给定一个UML图我必须实现一个课程管理应用程序,其中一部分是Student类,如下所示

    public class Student extends Person implements Encryptable {
    private String program;
    private Vector<Course> courses;

//constructor. 
    public Student(String Name, String pnr, String tel, String prog) {
            super(Name, pnr, tel);
            program = prog;
            courses = new Vector<Course>();
        }
/* implementation of related methods 
  ......  */

        @Override
    public void encrypt(String password) {
    }

    @Override
    public void decrypt(String password) {  
    }

此类的所有其他类和所有相关的setter和getter也实现了Encryptable接口如下

public interface Encryptable {

    public void encrypt(String password);
    public void decrypt(String password);
}

在之前的任务中,我实现了一个类“PassworCrypter”,我应该使用该类

public class PasswordCrypter {
    Cipher ecipher;
    Cipher dcipher;
    SecretKey key;
    DESKeySpec dks;
    SecretKeyFactory skf;
    byte[] psword;

    public PasswordCrypter(String password) {

        try {
            psword = password.getBytes("UTF-16");
            dks = new DESKeySpec(psword);
            skf = SecretKeyFactory.getInstance("DES");
            key = skf.generateSecret(dks);
            ecipher = Cipher.getInstance("DES");
            ecipher.init(Cipher.ENCRYPT_MODE, key);
            dcipher = Cipher.getInstance("DES");
            dcipher.init(Cipher.DECRYPT_MODE, key);
        } catch (NoSuchAlgorithmException e) {
            throw new CrypterException(e);
        } catch (NoSuchPaddingException e) {
            throw new CrypterException(e);
        } catch (InvalidKeyException e) {
            throw new CrypterException(e);
        } catch (InvalidKeySpecException e) {
            throw new CrypterException(e);
        } catch (UnsupportedEncodingException e) {
            throw new CrypterException(e);
        }

    }

    public byte[] encrypt(byte[] array) {

        try {
            return ecipher.doFinal(array);
        } catch (IllegalBlockSizeException e) {
            throw new CrypterException(e);
        } catch (BadPaddingException e) {
            throw new CrypterException(e);
        }
    }

    public byte[] decrypt(byte[] array) {

        try {
            return dcipher.doFinal(array);
        } catch (IllegalBlockSizeException e) {
            throw new CrypterException(e);
        } catch (BadPaddingException e) {
            throw new CrypterException(e);
        }
    }
}

我应该在Student的本地和继承字段上使用PasswordCrypter类 类。当Student对象被加密时,不应该获取数据 例如学生的名字没有先打电话解密。 Student对象应该 除非您需要访问其任何数据,否则始终加密。 任何人都可以给我一些想法或者告诉我应该如何加密这个该死的学生:)

1 个答案:

答案 0 :(得分:1)

我认为你Encryptable有问题。该方法的签名应为

public void encrypt(Encrypter enc);
public void decrypt(Decrypter dec);

您可以在其中定义两个单独的接口EncrypterDecrypter。所以最后你可以使用PasswordCrypter作为实现这两种方法的中心类。

 public class PasswordCrypter implements Encrypter,Decrypter  {

所以现在你可以在你的学生班里做

public void encrypt(Encrypter enc) {
   byte[] programbytes = enc.encrypt(program);
}

public void encrypt(Decrypter dec) {
   program = dec.decrypt(programbytes);
}