查找字符的奇数和偶数索引值时遇到问题
Trouble with finding odd and even index values for characters
我正在创建简单的 encryption/decryption 软件作为一个有趣的项目。我能够加密。它给了我加密的密码和密钥。我遇到的问题是解密。例如,这是一条加密消息:eUwG:Q_vul=u^CMiojpnif,这里是密钥:103141109141719141119050117050318040907010912。它的工作方式是首先在消息的开头或结尾添加一个随机盐,该盐由密钥中的第一个数字。因此,由于第一个数字是 1,因此 salt 位于开头(salt 有 14 个字符长),因此它删除了该文本,留下了 Miojpnif。在盐号后面的键中,文本中每个字母有 2 个数字。这就是我被困的地方。数字 1 表示字符向前移动,0 表示向后移动。因此,对于该字符的键中的 'M',它是 0,所以它向后移动,下一个数字是 3,这意味着它向后移动了 3。所以要反转这个,我需要将该字符向前移动 3。问题是,我不知道如何使它正常工作。我的想法是,它从键中删除第一个数字(盐),然后如果数字是奇数,那么它会记录该字符是向前还是向后,如果是偶数则它将向前或向后移动该字符(与其他数字一样存储为 int)按该数字。所以我卡住的地方是弄清楚它是偶数还是奇数不能正常工作,我不太清楚如何移动那个角色。
我已经查过如何判断它是偶数还是奇数,但它仍然不起作用。实际上改变了我自己编写代码的角色。我不知道你们是否明白我需要什么帮助,因为我真的不知道如何用语言表达。所以这是我的代码,希望大家能帮忙。
for(int i= 0; i < keyNew.length(); i++){
if(i % 2 == 1){
/*odd*/
if(keyNew.charAt(i) == '1') {
forward = 1;
backward = 0;
} else {
forward = 0;
backward = 1;
}
}else{
/*even*/
if(forward == 1 && backward == 0) {
/*forward*/
System.out.println("forward");
String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
} else if(forward == 0 && backward == 1) {
*backward*/
System.out.println("backward");
String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
}
}
}
encrypted 是密文,key 是密钥,encryptedNew 是没有加盐的文本,keyNew 是没有第一位数字的密钥。
这是长方法味道的一个很好的例子。我推荐以下内容:
- 使用 String 并使用 substring(...) 函数。它更容易,因为您需要更少的变量并且不必从 char 转换为 int 并返回。
- 创建一个函数 encrypt(...) 和 decrypt(...) 调用一些 "subfunctions"
- 一个子函数是 addSalt(...) 和 removeSalt(...)
- 一个子函数是 splitKeyToPairs(...),它 returns 一个字符串列表,每个项目有 2 位数字。
- 一个子函数是 shiftForward(...) 和 shiftBackwards(...)
那么我会按如下方式实现它:
public String decrypt(String key, String cipher) {
String cipherModified = removeSalt(key, cipher);
List<String> keyPairs = splitKeyToPairs(key.substring(1, key.length()));
String message = "";
for(int position = 0; position < keyPairs.size();++position) {
String keyTmp = keyPairs.get(position);
String cipherLetter = cipherModified.substring(position, position + 1);
message += "0".equals(keyTmp.substring(0, 1)) ? shiftBackwards(cipherLetter, keyTmp.substring(1, 2)) : shiftForward(cipherLetter, keyTmp.substring(1, 2));
}
return message;
}
public List<String> splitKeyToPairs(String key) {
List<String> result = new ArrayList<String>();
for(int i = 0; i < key.length(); i += 2) {
//i += 2 because we jump 2 characters per iteration.
result.add(key.substring(i, i+2));
}
return result;
}
这里有一个用于拆分但不用于解密的小测试函数:
public static void main(String[] args) {
List<String> result = splitKeyToPairs("1234567890");
List<String> test = new ArrayList<>(Arrays.asList("12", "34", "56", "78", "90"));
for(int i = 0; i < result.size();++i) {
if(!result.get(i).equals(test.get(i))) {
System.out.println("error on position " + i);
}
}
}
好的,这是解密消息的另一种方法。建立方法并将它们藏在图书馆中是可取的。在下面的示例中,我省略了密钥中的加盐数字。适应这一点的逻辑是微不足道的。
String key = "03141109141719141119050117050318040907010912";
String code = "eUwG:Q_vul=u^CMiojpnif";
int i = 0;
StringBuilder sb = new StringBuilder();
for (int pos = 0; pos < code.length(); pos++) {
// get codeLetter
char codeLetter = code.charAt(pos);
// set direction
int direction = key.charAt(i++) == '0' ? 1
: -1;
// set count
int count = key.charAt(i++) - '0';
// modify codeLetter based on direction and count
char c = (char) (codeLetter + (count * direction));
// save it.
sb.append(c);
}
System.out.println(sb.toString().substring(14));
我正在创建简单的 encryption/decryption 软件作为一个有趣的项目。我能够加密。它给了我加密的密码和密钥。我遇到的问题是解密。例如,这是一条加密消息:eUwG:Q_vul=u^CMiojpnif,这里是密钥:103141109141719141119050117050318040907010912。它的工作方式是首先在消息的开头或结尾添加一个随机盐,该盐由密钥中的第一个数字。因此,由于第一个数字是 1,因此 salt 位于开头(salt 有 14 个字符长),因此它删除了该文本,留下了 Miojpnif。在盐号后面的键中,文本中每个字母有 2 个数字。这就是我被困的地方。数字 1 表示字符向前移动,0 表示向后移动。因此,对于该字符的键中的 'M',它是 0,所以它向后移动,下一个数字是 3,这意味着它向后移动了 3。所以要反转这个,我需要将该字符向前移动 3。问题是,我不知道如何使它正常工作。我的想法是,它从键中删除第一个数字(盐),然后如果数字是奇数,那么它会记录该字符是向前还是向后,如果是偶数则它将向前或向后移动该字符(与其他数字一样存储为 int)按该数字。所以我卡住的地方是弄清楚它是偶数还是奇数不能正常工作,我不太清楚如何移动那个角色。
我已经查过如何判断它是偶数还是奇数,但它仍然不起作用。实际上改变了我自己编写代码的角色。我不知道你们是否明白我需要什么帮助,因为我真的不知道如何用语言表达。所以这是我的代码,希望大家能帮忙。
for(int i= 0; i < keyNew.length(); i++){
if(i % 2 == 1){
/*odd*/
if(keyNew.charAt(i) == '1') {
forward = 1;
backward = 0;
} else {
forward = 0;
backward = 1;
}
}else{
/*even*/
if(forward == 1 && backward == 0) {
/*forward*/
System.out.println("forward");
String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
} else if(forward == 0 && backward == 1) {
*backward*/
System.out.println("backward");
String encryptedNewer = encryptedNew.charAt(i / 2) += keyNew.charAt(i);
}
}
}
encrypted 是密文,key 是密钥,encryptedNew 是没有加盐的文本,keyNew 是没有第一位数字的密钥。
这是长方法味道的一个很好的例子。我推荐以下内容:
- 使用 String 并使用 substring(...) 函数。它更容易,因为您需要更少的变量并且不必从 char 转换为 int 并返回。
- 创建一个函数 encrypt(...) 和 decrypt(...) 调用一些 "subfunctions"
- 一个子函数是 addSalt(...) 和 removeSalt(...)
- 一个子函数是 splitKeyToPairs(...),它 returns 一个字符串列表,每个项目有 2 位数字。
- 一个子函数是 shiftForward(...) 和 shiftBackwards(...)
那么我会按如下方式实现它:
public String decrypt(String key, String cipher) {
String cipherModified = removeSalt(key, cipher);
List<String> keyPairs = splitKeyToPairs(key.substring(1, key.length()));
String message = "";
for(int position = 0; position < keyPairs.size();++position) {
String keyTmp = keyPairs.get(position);
String cipherLetter = cipherModified.substring(position, position + 1);
message += "0".equals(keyTmp.substring(0, 1)) ? shiftBackwards(cipherLetter, keyTmp.substring(1, 2)) : shiftForward(cipherLetter, keyTmp.substring(1, 2));
}
return message;
}
public List<String> splitKeyToPairs(String key) {
List<String> result = new ArrayList<String>();
for(int i = 0; i < key.length(); i += 2) {
//i += 2 because we jump 2 characters per iteration.
result.add(key.substring(i, i+2));
}
return result;
}
这里有一个用于拆分但不用于解密的小测试函数:
public static void main(String[] args) {
List<String> result = splitKeyToPairs("1234567890");
List<String> test = new ArrayList<>(Arrays.asList("12", "34", "56", "78", "90"));
for(int i = 0; i < result.size();++i) {
if(!result.get(i).equals(test.get(i))) {
System.out.println("error on position " + i);
}
}
}
好的,这是解密消息的另一种方法。建立方法并将它们藏在图书馆中是可取的。在下面的示例中,我省略了密钥中的加盐数字。适应这一点的逻辑是微不足道的。
String key = "03141109141719141119050117050318040907010912";
String code = "eUwG:Q_vul=u^CMiojpnif";
int i = 0;
StringBuilder sb = new StringBuilder();
for (int pos = 0; pos < code.length(); pos++) {
// get codeLetter
char codeLetter = code.charAt(pos);
// set direction
int direction = key.charAt(i++) == '0' ? 1
: -1;
// set count
int count = key.charAt(i++) - '0';
// modify codeLetter based on direction and count
char c = (char) (codeLetter + (count * direction));
// save it.
sb.append(c);
}
System.out.println(sb.toString().substring(14));