C# 沿直线寻找随机点

C# 沿直线寻找随机点,c#,.net,encryption,geometry,C#,.net,Encryption,Geometry,我正在编写一个小程序来帮助拆分密码(请参见下面的解释) 我有代码将文本转换为整数(文本ascii二进制->十进制整数) 因此,在这种情况下,“测试”一词将=1952805748 现在是有趣的部分。(对密码进行编码) 然后取x1=1952805748和y1=0 然后我建立一个随机点,其中x2=7,y2=142 这将在x1、y1和x2、y2之间画一条线(使用Y=mx+B) 我需要知道如何沿着这两个点创建的直线找到任意点(我们称之为x3,y3) 如果有人有什么想法,我很乐意听听。我正在努力找出两个点都

我正在编写一个小程序来帮助拆分密码(请参见下面的解释)

我有代码将文本转换为整数(文本ascii二进制->十进制整数)

因此,在这种情况下,“测试”一词将=1952805748

现在是有趣的部分。(对密码进行编码)

然后取x1=1952805748和y1=0

然后我建立一个随机点,其中x2=7,y2=142

这将在x1、y1和x2、y2之间画一条线(使用Y=mx+B)

我需要知道如何沿着这两个点创建的直线找到任意点(我们称之为x3,y3)

如果有人有什么想法,我很乐意听听。我正在努力找出两个点都是整数的代码(如果每个数字后面没有巨大的小数点,对每个人来说都比较容易)

++为什么++

一般的想法是,如果必须在两方之间拆分密码,那么一方可能会根据给定的字符串计算出密码

如果你用这个方法,他们会得到一个点,从这个点,从数学上不可能确定线在哪里与x相交(x=?y=0) 这样你就可以放心地把一套分数交给你的律师,一套给你的妻子

他们会做数学运算(把它输入到程序中),然后他们会得到一个数字,这个数字会被解码,说的是一个密码,这个密码可以根据你的意愿删除一个文件,或者其他一些你不希望他们在没有其他存在的情况下访问的敏感文档

//Assume x1, x2, and m, b exist as ints
Random r = new Random();
int x3 = r.Next(Math.Min(x1, x2), Math.Max(x1, x2));
int y3 = m * x3 + b;
基本上,我们在两个x之间选择一些x(保证正确的域,并通过对线性函数的约束,确定正确的范围),然后求解y。不太难。

如果端点是(x1,y1)和(x2,y2),并且在0到1的范围内有一个随机数r,那么沿着直线的点将是:

(x1+(x2-x1)*r,y1+(y2-y1)*r)
如果给定端点(1952805748,0)和(7,42)的随机值为0.5(沿直线的一半),则最终得到:

(976402877.5,21)
你可以很容易地算出它的中点。如果需要整数,可以对任何坐标进行四舍五入

以下是您的评论(意译):


我可能没有正确解释这一点:给一个人(x1,y1)给另一个人(x3,y3)。在任何情况下,一个人都无法从一个点上找出这条线与x(N,0)的交叉点。

假设你的(x1,y1)是(1952805748,0),任何人都知道x轴的交点(因为y=0)。听起来好像你想要两个点,它们都不在x轴上。这意味着一方应获得随机选择的终点(7,42),另一方应获得直线上的随机点(976402877.5,21)-这两个点的y值均不应为零。这可以通过确保随机值在0.2到1.0之间而不是0.0到1.0之间(假设您的y1始终为0)来实现

任何一方都无法计算出x轴与他们的一个坐标相交,但两个坐标的组合将为您提供该信息


此外,在这种情况下,舍入或纵坐标将不合适,您必须将它们映射,例如(976402877.5,21)变成(1952805755,42)[乘以2,这是最简单的整数比率]。

其他答案解决了您的数学想法,但在加密方面,我强烈建议您不要尝试制定自己的加密方案

如果您想使用两个密码对某个文件进行加密,而这两个密码都是必需的,那么有一种更简单的方法:对文件加密两次:

Plaintext -> Encrypted1 (with password 1)
Encrypted1 -> Encrypted2 (with password 2)
Encrypted2
是您存储的内容。扔掉
Encrypted1

要解密,只需使用密码2解密
Encrypted2
即可获得
Encrypted1
,然后解密
Encrypted1
即可返回纯文本

任何一个密码本身都是无用的,正如预期的那样,您不需要制定任何加密算法/代码


编辑:作为一个更简单的解决方案,只需编一个很长的密码,并给每一方一半。例如,使用密钥“this is a very long password”对文件进行加密,并给出您的wide“this a very”和您的律师“long password”。显然,您需要适当地选择密码,这样知道其中一半就不会给出任何关于另一半的提示。

不必为未知坐标求解。。只需将加密文件插入序列号生成器即可。您有效地将暴力强制加密的复杂性降低了几倍。每个字符不是94个字符中的1个(标准键盘上的可输入字符),而是将其减少到10分之一(如果允许小数,则为11分之一)


我反对这种方法。正如斯基特所提到的,只需对文件加密两次。

这种算法实际上被称为“”,是一种很好的分离机密的方法。你可以任意分割大的秘密,这些秘密需要你想聚集多少人来恢复秘密

我建议你稍微概括一下,然后寻找一个解决方案,让你指定N个点需要解N-1次多项式。你可以用它来解决这个问题

然而,Wikipedia上的伪代码只适用于浮点数,需要稍微修改以用于整数。如果你想要一些想法(并且假设它是有帮助的)

它给了我这个输出:

1 -- 50383220533284199945706810754936311181214547134666382315016772033813961148457676
2 -- 125723425896904546349739165166331731432281836699962161072279259011758052396215820
3 -- 235794378436564714387676526976517945151880763730707233042654663244625708155520494
'This is my super secret password.'

编辑:一年后,我更新了实现,使其在有限域内工作,这是证明安全所必需的。万岁

我承认有不同的方法可以做到这一点。但是,让我们假设密码实际上是密码,我给了你一个短语“pass”,最坏的情况是,你可以弄清楚它是什么,最好的情况是,你会半途而废,强制使用现在安全一半的密码。因此,取代原来的密码,将密码转换成一些大的密码