For this challenge we were given a pretty basic python script. The script contained two functions: s
, which approximates the derivative of the function f
at point x
, and encrypt
, which calculates the value of f(a)
and f(m)
, as well as the approximate derivative of f
at both a
and m
. It then does some manipulation of these numbers to return a tuple.
Essentially what we had to do was figure out what secret_func
(f
) was, so that we could calculate encrypt
for all possible ascii values, then map the resulting encrypted tuples to the given encrypted message to find the decrypted flag.
We're given:
- a = -9 Pi/4
- f(a) = -65.50409525102073
- df/dx = 1651/(12pi * cosx + 5pi * sinx)
So, let's separate variables and integrate df/dx to find f(x), since we're given an initial point we can use to calculate c
. Breaking out our good old friend, Mathematica:
> Integrate[1651/(12 Pi*Cos[x] + 5 Pi*Sin[x]), x]
> 1651 (-(Log[3 Cos[x/2] - 2 Sin[x/2]]/(13 \[Pi])) +
Log[2 Cos[x/2] + 3 Sin[x/2]]/(13 \[Pi]))
Evaluating at a:
> N[f[-9/4*Pi]]
> -65.5041 + 0. I
So, our c
is zero. So we have the correct secret_func, and now all that's left to do is calculate ascii value -> tuple pairs:
First, we define a function encrypt
which replicates the functionality of the Python program's encrypt
:
> s[x_] := (f[x + 10^(-3)] - f[x])/(10^(-3))
> encrypt[m_] :=
Module[{a, y0, y1, s0, s1, x},
a = -9/4*Pi;
y0 = f[a];
y1 = f[m];
s0 = s[a];
s1 = s[m];
x = (y1 - y0 + s0*a - s1*m)/(s0 - s1);
{FromCharacterCode[m], N[Re[x]], N[Re[s1*(x - m) + y1]]}
]
And then map this function over ascii values 40 to 130 for good measure:
> Map[encrypt, Range[40, 130]]
> {{"(", 18.7776, 2675.33}, {")", 6.97647, 1423.89}, {"*", 10.0881,
1753.86}, {"+", 94.6144,
10717.4}, {",", -41.7507, -3743.34}, {"-", -51.5124, -4778.52}, \
{".", 39.81, 4905.7}, {"/", 9.99491, 1743.98}, {"0", 9.79389,
1722.67}, {"1", 38.2941,
4744.95}, {"2", -59.6029, -5636.47}, {"3", -45.2358, -4112.92}, \
{"4", 138.261, 15345.8}, {"5", 14.8162, 2255.26}, {"6", 10.4197,
1789.02}, {"7", 24.6893,
3302.24}, {"8", -123.139, -12374.1}, {"9", -45.6087, -4152.46}, \
{":", -227.055, -23393.8}, {";", 23.2469, 3149.28}, {"<", 11.9605,
1952.42}, {"=", 19.2521, 2725.66}, {">", 600.793,
64394.8}, {"?", -51.2162, -4747.11}, {"@", -86.1523, -8451.89}, \
{"A", 40.5807, 4987.43}, {"B", 14.6646, 2239.17}, {"C", 16.9447,
2480.97}, {"D", 82.5567,
9438.75}, {"E", -65.2895, -6239.5}, {"F", -64.302, -6134.78}, {"G",
91.2579, 10361.5}, {"H", 19.145, 2714.3}, {"I", 16.3821,
2421.31}, {"J", 44.2629,
5377.91}, {"K", -103.971, -10341.5}, {"L", -58.9394, -5566.11}, \
{"M", 1215.76, 129609.}, {"N", 26.801, 3526.17}, {"O", 17.1525,
2503.}, {"P", 31.3629,
4009.93}, {"Q", -364.12, -37928.7}, {"R", -61.2426, -5810.35}, \
{"S", -159.487, -16228.6}, {"T", 41.265, 5060.}, {"U", 19.2867,
2729.33}, {"V", 25.6586, 3405.03}, {"W", 203.074,
22218.9}, {"X", -71.5534, -6903.76}, {"Y", -92.5404, -9129.31}, \
{"Z", 75.1891, 8657.45}, {"[", 23.2055, 3144.89}, {"\\", 23.2199,
3146.42}, {"]", 77.1465,
8865.03}, {"^", -98.2053, -9730.04}, {"_", -75.8477, -7359.14}, \
{"`", 222.297, 24257.4}, {"a", 29.9627, 3861.46}, {"b", 22.8126,
3103.22}, {"c", 48.4331,
5820.14}, {"d", -191.698, -19644.4}, {"e", -72.9015, -7046.71}, \
{"f", -440.179, -45994.4}, {"g", 42.1246, 5151.15}, {"h", 24.1013,
3239.89}, {"i", 36.7998, 4586.49}, {"j", 1605.57,
170946.}, {"k", -79.0086, -7694.34}, {"l", -141.407, -14311.3}, \
{"m", 67.1849, 7808.65}, {"n", 27.2622, 3575.09}, {"o", 31.3988,
4013.74}, {"p", 143.329,
15883.3}, {"q", -97.8033, -9687.41}, {"r", -99.3577, -9852.24}, \
{"s", 138.505, 15371.7}, {"t", 33.04, 4187.78}, {"u", 29.2437,
3785.21}, {"v", 74.5103,
8585.47}, {"w", -150.626, -15289.}, {"x", -87.5244, -8597.38}, {"y",
1132.97, 120829.}, {"z", 43.2698, 5272.6}, {"{", 29.3449,
3795.94}, {"|", 51.8057,
6177.78}, {"}", -466.765, -48813.7}, {"~", -88.3073, -8680.4}, \
{"�", -251.049, -25938.2}, {"�", 62.7549, 7338.88}, {"�", 31.5338,
4028.05}, {"�", 41.5967, 5095.17}}
This is a list of lists with the letter, and then the two encrypted values corresponding to that letter. I then just manually mapped each encrypted pair to the given encrypted message, to obtain the flag:
flag{c4lC_1z_fuN}