手柄君的小阁

个人私货聚集地

C# & Java 电话线传数据加密实战

本文最后更新于 2017 年 4 月 20 日,其中的内容可能有所发展或发生改变,敬请注意。

万年不写文章的我想了想不能万年不更新于是水了一篇毫无技术含量的入门文章
今天看到某不愿意透露姓名的社团的人丢出一个问题:(要求使用C#语言完成)

公司要在电话线上传输数据,但担心电话被窃听。所有数据用四位整数传输,他们要求编写一个程序,将数据进行加密,使数据传输更安全。
程序读取四位整数并加密如下:
将每个位换成该位与7的和并用10求模。然后交换第一位与第三位,交换第二位与第四位,并打印加密后的整数。
再编写一个程序读取加密的四位敷,并解密成原先的四位数。

问题为了省事我假设加密解密都写在一个程序里,分开当作两种方法,解题思路如下
1.通过字符串类型获取到每一位,计算后输出
2.通过数学计算获取到每一位的值,计算后输出
然而发现思路1需要多次转换数据类型,折腾而且折腾,故采用方法2,得到:

1
2
3
4
    千位数=输入数/1000;
    百位数=输入数%1000/100;
    千位数=输入数%100/10;
    千位数=输入数%10;

加密算法(不调换顺序)为

1
    (数字+7)%10;

解密算法为

1
    (数字+3)%10;

调换字符顺序,于是尝试得到:
(C#代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
using System;
 
namespace TelEncode {
    class Program {
        static void Main(string[] args) {
            Console.WriteLine("请输入一个数来加密或者解密。");
            int Input = int.Parse(Console.ReadLine());
            Console.WriteLine("您输入了{0},加密后的数值为{1}", Input, Encode(Input));
            Console.WriteLine("或者您输入了{0},解密后的数值为{1}", Input, Decode(Input));
            Console.Read();
        }
        private static Int Encode(int Input) {
            int K = (Input / 1000 + 7) % 10;
            int H = ((Input % 1000) / 100 + 7) % 10;
            int T = ((Input % 100) / 10 + 7) % 10;
            int A = (Input % 10 + 7) % 10;
            int Output = T * 1000 + A * 100 + K * 10 + H;
            return Output;
        }
        private static Int Decode(int Input) {
            int K = (Input / 1000 + 3) % 10;
            int H = ((Input % 1000) / 100 + 3) % 10;
            int T = ((Input % 100) / 10 + 3) % 10;
            int A = (Input % 10 + 3) % 10;
            int Output = T * 1000 + A * 100 + K * 10 + H;
            return Output;
        }
    }
}

然而有一个问题,当输出结果前几位出现0的时候会导致位数不足,故修改
(C#代码)

12
        private static String Encode(int Input) {
17
            String Output = "" + T + A + K + H;
20
        private static String Decode(int Input) {
25
            String Output = "" + T + A + K + H;

转换输出加密/解密后数据类型为String字符串类型,这样即使出现0也会被正常输出
输出效果如下

那么我校建议我们学的是java那么移植进java,得到如下
(Java代码)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.util.Scanner;
 
public class Program {
 
	public static void main(String[] args) {
        System.out.println("请输入一个数来加密或者解密。");
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();
        in.close();
        System.out.printf("您输入了%s,加密后的数值为%s%n", input, encode(input));
        System.out.printf("或者您输入了%s,解密后的数值为%s%n", input, decode(input));
	}
	private static String encode(int input) {
        int K = (input / 1000 + 7) % 10;
        int H = ((input % 1000) / 100 + 7) % 10;
        int T = ((input % 100) / 10 + 7) % 10;
        int A = (input % 10 + 7) % 10;
        //int Output = T * 1000 + A * 100 + K * 10 + H;
        String output = "" + T + A + K + H;
        return output;
    }
    private static String decode(int input) {
        int K = (input / 1000 + 3) % 10;
        int H = ((input % 1000) / 100 + 3) % 10;
        int T = ((input % 100) / 10 + 3) % 10;
        int A = (input % 10 + 3) % 10;
        //int Output = T * 1000 + A * 100 + K * 10 + H;
        String output = "" + T + A + K + H;
        return output;
    }
}

吐槽一句:eclipse相比VS真的卡,还不好用
可以看到代码相比C#几乎就不用修改……果然两个语言差距不大么……
测试运行,OK

至此,C#和Java均基本实现了题目要求,嗯……
至少由此学到以下内容:
1.静态方法里面不能调用实例方法,所以我们在声明方法的时候务必注意……
2.数据补位的话String相对简单,但是批量的话还是最好用专门的格式化方法……
然而实际上来说这完全没什么可以学到的……没难度好么……

  1. 头像 Formyown说道:

    尝试使用BigDecimal和BigInteger

来一发吐槽