`

(JAVA) 使用异或进行简单的密码加密(JAVA实现)[转]

 
阅读更多

http://blog.sina.com.cn/s/blog_532af66a0100a1lq.html

import java.io.BufferedReader;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import org.apache.log4j.Logger;
import org.apache.log4j.PropertyConfigurator;


public class ChgAnGo {

 // log4jのプロパティフィアル名
 private static String LOG_PROPERTIES = "log4j.properties";

 // パスワードファイルパス
 private static String PASSWORD_FILEPATH = "output/password.txt";

 // 反転用文字入力ファイルパス
 private static String CONVERT_FILEPATH = "input/convert.txt";

 // ログメッセージ:暗号化処理開始
 private static String LOG_ENCRYPT_START = "文字列の暗号化開始";

 // ログメッセージ:暗号化処理完了
 private static String LOG_ENCRYPT_END = "文字列の暗号化完了";

 // ログメッセージ:暗号化処理前
 private static String LOG_ENCRYPT_BEFORE = "暗号化処理前:";

 // ログメッセージ:暗号化処理後
 private static String LOG_ENCRYPT_AFTER = "暗号化処理後:";

 //反転用文字を取得できない場合
 private static String LOG_CONVERT_KEY_READ_ERROR = "暗号化のキーワードの取得に失敗しました。";

 //ファイルに出力失敗場合
 private static String LOG_FILE_WRITE_ERROR = "暗号化したパスワードのファイル出力に失敗しました。";

 // コンソールメッセージ:入力メッセージ
 private static String CONSOLE_INPUT_MESSAGE = "暗号化したいパスワードを入力してください。";

 // コンソールメッセージ:入力した文字列バイト数>40場合
 private static String CONSOLE_INPUT_COUNT_ERROR = "エラー:40バイト以内文字列を入力してください。";

 // コンソールメッセージ:半角英数字、半角記号以外が入力された場合
 private static String CONSOLE_INPUT_CHAR_ERROR = "エラー:半角英数字、半角記号を入力してください。";

 // コンソールメッセージ:ファイルに出力失敗場合
 private static String CONSOLE_FILE_WRITE_ERROR = "エラー:暗号化したパスワードをファイルに出力するのは失敗しました。";

 // コンソールメッセージ:反転用文字入力ファイルを取得できない場合
 private static String CONSOLE_CONVERT_KEY_READ_ERROR = "エラー:暗号化のキーワードの取得に失敗しました。";

 // コンソールメッセージ:暗号化成功場合
 private static String CONSOLE_SUCCESS_END = "暗号化したパスワードはoutput/password.txtに出力しました。";

 // コンソールメッセージ:プログラム終了
 private static String CONSOLE_END = "処理終了しました。";

 // ログを出力するために、loggerを取得
 private static Logger logger = Logger.getLogger(ChgAnGo.class.getName());

 
 public static void main(String[] args) {

  ChgAnGo chgAnGo = new ChgAnGo();

  //log4jプロパティファイルを取得する
  PropertyConfigurator.configure(LOG_PROPERTIES);

  //処理開始ログ出力
  logger.info(LOG_ENCRYPT_START);

  try {

   //暗号化したい文字列
   String inStr = "";

   //暗号化したい文字列の取得
   //コマンドラインから入力した引数が存在(args.length==1)場合
   if (args.length == 1) {
    inStr = args[0];
   } else {

    //コマンドラインから入力した引数が不存在(args.length<>1)場合
    //    byte[] input = new byte[41];

    //スクリーンへメッセージを出力する。
    System.out.println(CONSOLE_INPUT_MESSAGE);

    //スクリーンから暗号化したい文字列を取得する。
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    inStr = br.readLine();

   }

   // 文字列のチェック
   //入力した文字列バイト数>40場合
   if (inStr.getBytes().length > 40) {
    System.out.println(CONSOLE_INPUT_COUNT_ERROR);
   } else if (inStr.getBytes().length > inStr.length()) {

    //    半角英数字、半角記号以外が入力された場合
    System.out.println(CONSOLE_INPUT_CHAR_ERROR);
   } else if ("".equals(inStr)) {

    //何も入力しない場合
    System.out.println(CONSOLE_INPUT_CHAR_ERROR);
   } else {

    //上記以外場合、文字列に暗号化処理
    //暗号化のキーワードの取得
    String cstrKey = chgAnGo.getConvertKey(CONVERT_FILEPATH);

    if (cstrKey != null && !"".equals(cstrKey)) {
     //暗号化処理メソッドを呼び出す
     String ango = chgAnGo.setEncrypt(inStr, cstrKey);

     //暗号化した文字列をファイルに出力する。
     chgAnGo.writeToFile(PASSWORD_FILEPATH, ango.getBytes());

     //正常終了時、ログを出力する。
     logger.info(LOG_ENCRYPT_BEFORE + inStr);
     logger.info(LOG_ENCRYPT_AFTER + ango);

     //スクリーンへメッセージを出力する。
     System.out.println(CONSOLE_SUCCESS_END);
     
     System.out.println(chgAnGo.getEncrypt(ango, cstrKey));

    } else {
     //反転用文字を取得できない場合、ログを出力する。
     logger.info(LOG_CONVERT_KEY_READ_ERROR);

     //スクリーンへメッセージを出力する。
     System.out.println(CONSOLE_CONVERT_KEY_READ_ERROR);
    }
   }

  } catch (IOException e) {

   //例外エラー発生場合、詳細エラーを出力する。
   logger.fatal(e.getMessage());

  } finally {

   //処理完了ログ出力
   //スクリーンへメッセージを出力する
   System.out.println(CONSOLE_END);

   //「文字列の暗号化完了」ログを出力する。
   logger.info(LOG_ENCRYPT_END);
  }

 }

 
 protected String setEncrypt(String password, String cstrKey) {

  //int[] snNum = new int[password.length()];
  char[] snNum = new char[password.length()];
  String result = "";

  //ビット反転操作を繰り回す
  for (int i = 0, j = 0; i < password.length(); i++, j++) {

   //反転用文字列」<「暗号化したい文字列」場合、
   //反転用文字列を繰り回して利用する
   if (j == cstrKey.length())
    j = 0;

   //暗号化したバイト=(暗号化したい文字)^(反転用文字)^(1/(当該文字の位置+1))
   //snNum[i] = password.charAt(i) ^ cstrKey.charAt(j) ^ (1 / (i + 1));
   snNum[i] = (char) (password.charAt(i) ^ cstrKey.charAt(j) ^ (1 / (i + 1)));
   result += (char) snNum[i];
  }

  //暗号化した文字列を返す。
  return result;
 }

 
 protected String getEncrypt(String password, String cstrKey) {

  char[] snNum = new char[password.length()];
  String result = "";

  //ビット反転操作を繰り回す
  for (int i = 0, j = 0; i < password.length(); i++, j++) {

   //反転用文字列」<「復号化したい文字列」場合、
   //反転用文字列を繰り回して利用する   
   if (j == cstrKey.length())
    j = 0;
   char n = password.charAt(i);

   //復号化したバイト=(復号化したい文字)^(反転用文字)^(1/(当該文字の位置+1))
   snNum[i] = (char) (n ^ cstrKey.charAt(j) ^ (1 / (i + 1)));
   result += snNum[i];
  }

  //復号化した文字列を返す。
  return result;
 }

 
 protected void writeToFile(String filePath, byte[] data) throws IOException {

  FileOutputStream outfile = null;
  
  try {
   //ファイルパスより、出力ファイルを開く
   outfile = new FileOutputStream(filePath);

   //データをファイルに出力する
   outfile.write(data, 0, data.length);

   //ファイルを保存する
   outfile.flush();

  } catch (IOException e) {
   //ファイル出力失敗場合、ログを出力する。
   logger.info(LOG_FILE_WRITE_ERROR);

   //スクリーンへメッセージを出力する。
   System.out.println(CONSOLE_FILE_WRITE_ERROR);
   
   throw e;

  } finally {

   //ファイルをクローズする
   if (outfile != null) {
    outfile.close();
   }
  }

 }

 
 protected String getConvertKey(String filePath) throws IOException {

  String convertKey = null;
  BufferedReader br = null;

  try {
   //ファイルパスより、入力ファイルを開く
   br = new BufferedReader(new FileReader(filePath));

   //反転用文字を取得する
   convertKey = br.readLine();

   //反転用文字を返す
   return convertKey;

  } catch (IOException e) {

   //反転用文字を取得できない場合、ログを出力する。
   logger.info(LOG_CONVERT_KEY_READ_ERROR);

   //スクリーンへメッセージを出力する。
   System.out.println(CONSOLE_CONVERT_KEY_READ_ERROR);

   throw e;

  } finally {

   //ファイルをクローズする
   if (br != null) {
    br.close();
   }

  }

 }

}

分享到:
评论

相关推荐

    java使用异或对文件进行加密解密

    在上述代码中,展示了如何使用Java实现文件的异或加密和解密。首先,我们需要了解异或加密的核心步骤: 1. **加密过程**:读取原始文件(如a.txt)的字节数据,逐个字节与一个预设的密钥(在这个例子中为1234)进行...

    Java异或 加密 和 解密方法

    在"Java异或加密解密.txt"这个文件中,可能包含了具体的Java代码示例,展示了如何使用Java实现上述的异或加密和解密过程。通过阅读和理解这段代码,你可以学习到如何在Java程序中应用异或加密技术,从而保护敏感数据...

    Java异或运算(简单的加密,解密)

    `Example.java` 文件可能展示了如何使用异或运算进行简单的加密和解密。在加密过程中,原始数据通常与一个称为密钥的固定值进行异或操作。这个密钥是秘密的,只有拥有它的人才能解密。解密过程就是再次用相同的密钥...

    (Java)文件快速加密(异或加密)

    异或加密是一种简单而有效的加密算法,其基本原理是将明文数据与一个密钥进行逐位异或操作,得到的密文就是加密后的结果。解密时,再用相同的密钥与密文进行异或,即可还原出原始数据。这种加密方式的优点在于它速度...

    Java中使用异或运算符实现加密字符串

    需要注意的是,虽然异或加密相对简单,但它并不安全。对于专业人士来说,这种加密方式很容易被破解,因为只需要知道密钥,就可以通过相同的异或操作解密。此外,如果使用相同的密钥对多个字符串进行加密,可能会导致...

    Java异或对字符进行加密和解密

    class XORTest { public static void main(String args[]){ char a1='欢',a2='迎',a3='下',a4='载'; char secret='8'; a1=(char)(a1^secret); a2=(char)(a2^secret); a3=(char)(a3^secret);...

    Java使用异或运算实现简单的加密解密算法实例代码

    Java 使用异或运算实现简单的加密解密算法实例代码 在信息安全领域中,数据加密和解密是非常重要的环节。Java 作为一门流行的编程语言,也提供了多种方式来实现加密和解密。在本篇文章中,我们将介绍使用异或运算...

    十六进制字符串按位异或运算工具和java位异或运算

    例如,简单的单密钥加密算法如XOR密码就是基于异或操作的。当两段相同的数据进行异或时,结果是0,这在生成校验和或者计算CRC(循环冗余校验)时非常有用,因为任何数据和0异或都保持不变。此外,异或运算也常用于位...

    java中3DES加密、异或加密

    在Java中,异或加密通常用于实现简单的加密需求,例如密码的哈希处理。下面是一个简单的异或加密示例: ```java public static byte[] xor(byte[] data, byte[] key) { for (int i = 0; i ; i++) { data[i] = ...

    Java编程实现同步序列密码的加密解密系统

    本文将深入探讨如何使用Java编程实现一个同步序列密码(流密码)的加密和解密系统。 同步序列密码是一种流密码类型,它的工作方式是通过一个伪随机生成器产生与明文或密文等长的密钥流,然后按位或按字节逐个与明文...

    java异或运算操作简单

    Java中的异或运算是一种基本的逻辑运算,它在编程中有着广泛的应用,特别是在位操作、数据加密、数据校验等领域。异或运算符是`^`,它遵循特定的运算规则,这些规则对于理解它的行为至关重要。 首先,异或运算的...

    java使用异或实现变量互换和异或加密解密示例

    本文将详细讲解如何使用Java中的异或运算来实现变量互换以及异或加密解密。 首先,我们来看一下如何用异或来实现两个变量的互换,这是基于异或运算的一个重要性质:任何数与0异或都等于它本身,以及同一个数连续...

    java异或加密算法

    Java 异或加密算法是一种基于异或操作的简单加密技术,通常用于保护数据的隐私,尤其是在简单的通信或存储中。异或加密算法的核心是异或(XOR)运算,其特性是“相同为0,不同为1”,即任何数字与0进行异或运算结果...

    祖冲之密码算法Java实现

    在Java中实现祖冲之密码算法,可以为软件开发者提供一种可靠的加密手段,保护数据的安全传输。 祖冲之密码算法的核心思想是基于线性反馈移位寄存器(LFSR)和有限域上的非线性函数。算法主要包括三个主要部分:初始...

    Java异或技操作给任意的文件加密原理及使用详解

    Java异或技操作给任意的文件加密原理及使用详解 本文主要介绍了Java异或技操作给任意的文件加密原理及使用详解,具有一定借鉴价值,需要的朋友可以参考下。 异或操作 异或是一种基于二进制的位运算,用符号XOR...

    java密码加密方法

    本文将通过一个具体的Java代码示例来解析如何在Java中实现密码的加密与解密,以帮助读者深入理解并掌握这一关键技术。 #### 二、DES算法概述 DES(数据加密标准)是一种对称加密算法,由IBM公司开发,并于1977年被...

    最简单的异或加密

    异或加密是一种简单而常见的对称加密方法,它基于位操作中的异或(XOR)逻辑。在计算机科学中,异或操作是一种基本的逻辑运算,它的结果是两个输入位不相同为1,相同为0。在加密领域,异或加密利用了异或的这一特性...

    异或加密解密算法

    在Java中实现异或加密解密,我们可以创建三个类:`Encoder`、`Decoder`和`Utils`。`Encoder`类负责加密过程,`Decoder`类负责解密,而`Utils`类可以提供一些辅助函数,如将字符串转换为字节数组,以及处理其他与二...

    java AES/MD5/异或运算加密解密算法示例

    使用异或位运算实现加密解密比aes算法更快,但安全性有待思考。为什么基本上使用md5对用户密码加密?因为md5算法是不可逆的:对加密结果不能进行解密。任意长度的数据,算出的md5值长度都是固定的。部分参考uikoo9...

    (Java)文件异或加密(循环指定长度pi为异或常量)

    对每个字节进行异或操作,异或的常量为根据key算出的pi的小数部分的指定长度的某个值(根据key的位数,如果key为三位数,那么就去10^3个pi的小数位数为异或常量的取值),再根据key来决定从这个数组哪个位置来取出...

Global site tag (gtag.js) - Google Analytics