Q:

Encrypted In Numbers!

The Problem:
Two enemy secret agents have devised a wonderful (for you) method of communication!
Here’s how the encryption process works:
1) Take the ascii equivalents of each letter. (No spaces, numbers, or punctuation are sent)
2) For each letter in the message, the ascii equivalent of it and the letter after it (If it exists, if it doesn’t, it should be considered 0), are multiplied (this product is stored in an array/list) and summed (this number is also stored in a different list).
3) The two lists (of sums and products) are joined together (the sums list, then the multiples list, into the same array) and transmitted.
You need to write the smallest program able to reverse this process and decrypt messages sent in this format!
Example Input and Output Pairs:
[173, 209, 216, 219, 198, 198, 225, 222, 208, 100, 7272, 10908, 11664, 11988, 9657, 9657, 12654, 12312, 10800, 0] -> “HelloWorld”
[131, 133, 164, 195, 197, 99, 4290, 4422, 6499, 9506, 9702, 0] -> “ABCabc”

This is code-golf, so the smallest solution in bytes wins.
Error messages are allowed.
Your program can be given either a list/1-dimensional array or a comma-separated string, if you specify in your submission. The default is an array/list.

A:

brainfuck, 66 bytes
,[>>>+<[-<+>>-<]<[->+<],]>[<<,>>[-<+>]<-]<<<[>[-<->>+<]<<]>.>>[.>]

Input is the encrypted string. Assumes infinite sized cells and 0 on EOF.
How it Works:
,[>>>+<[-<+>>-<]<[->+<],] Gets input and the number of characters divided by 2
>[<<,>>[-<+>]<-]<<< Remove the second half of the string (the multiplication part)
[>[-<->>+<]<<] Subtract each character from the previous one, while keeping a copy of the previous one.
>.>>[.>] Print the characters

A:

Haskell, 45 35 bytes
map toEnum.scanr1(-).fst.span(<245)

Try it online!
Explanation

fst.span(<245) takes all numbers from the beginning of the list that are smaller than 245. Those are only the numbers from the summation part, because the largest possible summation is z + z = 122 + 122 = 244, and the smallest possible product is A * A = 65 * 65 = 4225.
scanr1(-) takes the last value of the list and uses it as initial accumulator. Then from back to front each element of the list is subtracted by the current accumulator, and the result is used as the next accumulator and and added to a list.
map toEnum replaces each number in the list with the corresponding character to recreate the string.

A:

Husk, 7 6 bytes
mcĠ≠←½

Try it online! According to the documentation the leading m should not be needed, but there seems to be a bug currently.
Edit: -1 byte thanks to Zgarb!
Explanation:
     ½ -- split input list into half
    ←  -- take first list
  Ġ≠   -- subtract each list element from the previous one
mc     -- convert list of code points to string

