Versioning systems do something like this already. Most store old versions of files as diffs against new versions (or this may be reversed); git stores files as diffs against similarly sized files of I think similar age (which are most likely older/newer versions of the same file).
There's also a fingerprinting algorithm that's basically to divide your file into chunks based on a fixed short string or rolling-checksum value and then hash each chunk, which can be used to find good candidates for storing as diffs against eachother. Unfortunately I don't recall what name this goes by or where I ran across it, or what system actually uses it.